免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1332 | 回复: 0
打印 上一主题 下一主题

Linux UDP简单封装 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-12-18 14:44 |只看该作者 |倒序浏览

                                               
               
               
               
               
               
                   1. //CUdp.h  
   2. #ifndef MY_CUDP  
   3. #define MY_CUDP  
   4. #include sys/types.h>  
   5. #include sys/socket.h>  
   6. #include netinet/in.h>  
   7. #include unistd.h>  
   8. class CUdp{  
   9. public:  
  10.   CUdp(const char* destIP, unsigned short localPort, unsigned short destPort);  
  11.   CUdp(unsigned int destIP, unsigned short localPort, unsigned short destPort);  
  12.   int sendData(void *data, unsigned int length);  
  13.   int recvData(void *data, unsigned int length,unsigned int &inIP,unsigned short& inPort);  
  14.   ~CUdp(){close(sock_fd);}  
  15. private:  
  16.  int sock_fd;  
  17.  struct sockaddr_in local_addr;  
  18.   struct sockaddr_in dest_addr;  
  19. };  
  20. #endif  
  21. //CUdp.cpp  
  22. #include "CUdp.h"  
  23. #include stdlib.h>  
  24. #include string.h>  
  25. #include stdio.h>  
  26. #include errno.h>  
  27. #include assert.h>  
  28. #include arpa/inet.h>  
  29.   
  30. CUdp::CUdp(unsigned int destIP,unsigned short localPort, unsigned short destPort)  
  31. {  
  32.  memset(&local_addr,0,sizeof(local_addr));  
  33.  local_addr.sin_family = AF_INET;  
  34.  local_addr.sin_addr.s_addr = htonl(INADDR_ANY);  
  35.  local_addr.sin_port = htons(localPort);  
  36.   
  37.  memset(&dest_addr, 0, sizeof(dest_addr));  
  38. /* 协议地址组包 */  
  39.  dest_addr.sin_family = AF_INET;                    /* 协议名 */  
  40.  dest_addr.sin_addr.s_addr = htonl(destIP);  /* 自动分配地址 */  
  41.  dest_addr.sin_port = htons(destPort);                   /* 端口号 */  
  42. /* 组装系统调用socket和bind */  
  43.   
  44. if((sock_fd = socket(AF_INET, SOCK_DGRAM, 0))  0)  
  45. {  
  46.  perror(strerror(errno));  
  47.  exit(0);  
  48. }   
  49. /* 创建UDP套接字描述符 */  
  50. if(bind(sock_fd, (struct sockaddr *)&local_addr, sizeof(local_addr))  0 )   /* 命名套接字 */  
  51. {  
  52.  perror(strerror(errno));  
  53.  exit(0);  
  54. }      // return 0;                              /* 准备成功,正确返回 */  
  55. //assert(close(*pnSock) == 0);           /* 准备失败,关闭套接字描述符 */  
  56.   //return 1;  
  57. }  
  58.   
  59. CUdp::CUdp(const char* destIP, unsigned short localPort, unsigned short destPort)  
  60. {  
  61.  memset(&local_addr,0,sizeof(local_addr));  
  62.  local_addr.sin_family = AF_INET;  
  63.  local_addr.sin_addr.s_addr = htonl(INADDR_ANY);  
  64.  local_addr.sin_port = htons(localPort);  
  65.   
  66.  memset(&dest_addr, 0, sizeof(dest_addr));  
  67. /* 协议地址组包 */  
  68.  dest_addr.sin_family = AF_INET;                    /* 协议名 */  
  69.  dest_addr.sin_addr.s_addr = inet_addr(destIP);  /* 自动分配地址 */  
  70.  dest_addr.sin_port = htons(destPort);                   /* 端口号 */  
  71. /* 组装系统调用socket和bind */  
  72.   
  73. if((sock_fd = socket(AF_INET, SOCK_DGRAM, 0))  0)  
  74. {  
  75.  perror(strerror(errno));  
  76.  exit(0);  
  77. }   
  78. /* 创建UDP套接字描述符 */  
  79. if(bind(sock_fd, (struct sockaddr *)&local_addr, sizeof(local_addr))  0 )   /* 命名套接字 */  
  80. {  
  81.  perror(strerror(errno));  
  82.  exit(0);  
  83. }      
  84. }  
  85.   
  86. int CUdp::sendData(void *data, unsigned int length)  
  87. {  
  88.  int send_len;  
  89.  send_len = sendto(sock_fd, data, length, 0, (struct sockaddr *)&dest_addr,  sizeof(dest_addr));  
  90.  if(send_len  0)  
  91.  {  
  92.   perror(strerror(errno));  
  93.   send_len = 0;  
  94.  }  
  95.  return send_len;  
  96. }  
  97.   
  98. int CUdp::recvData(void *data, unsigned int buf_length,unsigned int &inIP,unsigned short& inPort)  
  99. {  
100.  int recv_len;  
101.  struct sockaddr_in src_addr;  
102.  socklen_t src_len;  
103.  recv_len = recvfrom(sock_fd, data, buf_length, 0, (struct sockaddr *)&src_addr, &src_len);  
104.   
105.  inIP = htonl(src_addr.sin_addr.s_addr);  
106.  inPort = htons(src_addr.sin_port);  
107.   
108.  if(recv_len  0)  
109.  {  
110.   perror(strerror(errno));  
111.   recv_len = 0;  
112.  }  
113.  return recv_len;  
114. }  
115. #ifdef DEBUG  
116. char* ValueToIP(const int& nValue,char* str)  
117. {  
118. //数值转化为IP  
119. //没有格式检查  
120. //返回值就是结果  
121.  //char strTemp[20];  
122.  sprintf( str,"%d.%d.%d.%d",  
123.   (nValue&0xff000000)>>24,  
124.   (nValue&0x00ff0000)>>16,  
125.   (nValue&0x0000ff00)>>8,  
126.   (nValue&0x000000ff) );  
127.  return str;  
128. }  
129. int main()  
130. {  
131.  char mybuffer[1024]={0xAA};  
132. if(fork()==0)  
133. {  
134.   CUdp myUdp("192.168.1.198",2000,2001);  
135.   while(1)  
136.   {  
137.     printf("send : %d  head:0x%x tail:0x%x\n",myUdp.sendData(mybuffer,1024),mybuffer[0],mybuffer[1023]);  
138.     sleep(2);  
139.   }  
140. }  
141. else  
142. {  
143.  CUdp myUdp2("127.0.0.1",2001,2000);  
144.  unsigned int IP = 0;  
145.  unsigned short port = 0;  
146.  while(1)  
147.  {  
148.   printf("recv :%d  head:0x%x tail:0x%x\n",myUdp2.recvData((void*)mybuffer,1024,IP,port),mybuffer[0],mybuffer[1023]);  
149.   char ip[20];  
150.   printf("IP:%s port:%u\n",ValueToIP(IP,ip),port);  
151.  }  
152. }  
153.  return 0;   
154. }  
155.   
156. #endif  


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/108358/showart_2125017.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP