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
|