Chinaunix首页 | 论坛 | 博客
  • 博客访问: 161048
  • 博文数量: 56
  • 博客积分: 2510
  • 博客等级: 少校
  • 技术积分: 502
  • 用 户 组: 普通用户
  • 注册时间: 2009-12-18 14:21
文章分类

全部博文(56)

文章存档

2010年(39)

2009年(17)

我的朋友

分类: LINUX

2009-12-18 14:44: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


阅读(1515) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~

ssddyb2010-02-03 10:50:40

谢谢提醒啊。找轮子的功力不够,还要锻炼啊。

blazewater2010-01-22 21:21:35

ACE里面都封装的好好的了,用ACE就是了,何必自己再重复制造轮子呢。