udp.h 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. #ifndef _UDP_H
  2. #define _UDP_H
  3. #include <stdio.h>
  4. #include <unistd.h>
  5. #include <string.h>
  6. #include <strings.h>
  7. #include <sys/types.h>
  8. #include <sys/socket.h>
  9. #include <netinet/in.h>
  10. #include <arpa/inet.h>
  11. #include <errno.h>
  12. #include "debug.h"
  13. #include "mychat.h"
  14. /********************UDP广播 点对点通信*************************/
  15. /* 信息检测 */
  16. extern char udp_info_check(struct sockaddr_in *sin)
  17. {
  18. if (!sin)
  19. {
  20. pr_debug("地址为空\n");
  21. return -1;
  22. }
  23. char ip[16];
  24. u_short port;
  25. inet_ntop(AF_INET, (void *)&(sin->sin_addr.s_addr), ip, sizeof(ip));
  26. port = ntohs(sin->sin_port);
  27. pr_debug("信息检测地址:%s:%d\n", ip, port);
  28. return 1;
  29. }
  30. /* 接收到(绑定IP, 绑定端口, 客户信息, 内容) */
  31. extern char udp_recv_from(char *ip, int port, struct sockaddr_in *recv_cin, struct msg_udp *recv_msg)
  32. {
  33. int ret = -1;
  34. struct sockaddr_in sin;
  35. int udp_recv_fd;
  36. udp_recv_fd = socket(AF_INET, SOCK_DGRAM, 0);
  37. if(udp_recv_fd < 0)
  38. {
  39. perror("udp_recv_from->socket\nError:");
  40. return udp_recv_fd;
  41. }
  42. sin.sin_family = AF_INET;
  43. sin.sin_port = htons(port);
  44. sin.sin_addr.s_addr = inet_addr(ip);
  45. bzero(sin.sin_zero, 8);
  46. do{
  47. ret = bind(udp_recv_fd, (struct sockaddr*)&sin, sizeof(sin));
  48. if (ret < 0) {
  49. perror("udp_recv_from->bind\nError:");
  50. udp_info_check(&sin);
  51. sleep(1);
  52. }
  53. }
  54. while (ret < 0);
  55. struct msg_udp msg_buf;
  56. struct sockaddr cin_in;
  57. socklen_t addrlen= sizeof(struct sockaddr);
  58. bzero(&msg_buf, sizeof(msg_buf));
  59. bzero(&cin_in, addrlen);
  60. ret = recvfrom(udp_recv_fd, &msg_buf, sizeof(msg_buf), 0, &cin_in, &addrlen);
  61. if (ret < 0) {
  62. perror("udp_recv_from->recvfrom\nError:");
  63. return ret;
  64. }
  65. memcpy(recv_msg, &msg_buf, sizeof(msg_buf));
  66. memcpy(recv_cin, &cin_in, sizeof(struct sockaddr_in));
  67. close(udp_recv_fd);
  68. return 1;
  69. }
  70. /* 发送(IP,端口,信息) */
  71. extern char udp_send_to(char *ip, unsigned int port, struct msg_udp *str, int size_str)
  72. {
  73. int ret = -1;
  74. struct sockaddr_in sin;
  75. int udp_send_fd;
  76. udp_send_fd = socket(AF_INET, SOCK_DGRAM, 0);
  77. if(udp_send_fd < 0)
  78. {
  79. perror("udp_send_to->socket\nError:");
  80. return udp_send_fd;
  81. }
  82. sin.sin_family = AF_INET;
  83. sin.sin_port = htons(port);
  84. sin.sin_addr.s_addr = inet_addr(ip);
  85. bzero(sin.sin_zero, 8);
  86. ret = sendto(udp_send_fd, str, size_str, 0, (struct sockaddr*)&sin, sizeof(struct sockaddr_in));
  87. if (ret < 0) {
  88. perror("udp_send_to->sendto\nError:");
  89. udp_info_check(&sin);
  90. return ret;
  91. }
  92. close(udp_send_fd);
  93. return 1;
  94. }
  95. /* 发送(地址,信息, 大小) */
  96. extern char udp_addr_send_to(struct sockaddr_in *sin, struct msg_udp *str, int size_str)
  97. {
  98. int ret = -1;
  99. int udp_send_fd;
  100. udp_send_fd = socket(AF_INET, SOCK_DGRAM, 0);
  101. if(udp_send_fd < 0)
  102. {
  103. perror("udp_addr_send_to->socket\nError:");
  104. return udp_send_fd;
  105. }
  106. ret = sendto(udp_send_fd, str, size_str, 0, (struct sockaddr*)sin, sizeof(*sin));
  107. if (ret < 0) {
  108. perror("udp_addr_send_to->sendto\nError:");
  109. udp_info_check(sin);
  110. return ret;
  111. }
  112. close(udp_send_fd);
  113. return 1;
  114. }
  115. /********************UDP广播 接受与发送*************************/
  116. /* 接收到(绑定IP, 绑定端口, 客户信息, 内容) */
  117. extern char udp_broad_recv_from(uint32_t ip, int port, struct sockaddr_in *online_cin, struct msg_udp *recv_msg)
  118. {
  119. int ret = -1;
  120. struct sockaddr_in sin;
  121. int udp_broad_recv_fd;
  122. udp_broad_recv_fd = socket(AF_INET, SOCK_DGRAM, 0);
  123. if(udp_broad_recv_fd < 0)
  124. {
  125. perror("udp_broad_recv_from->socket\nError:");
  126. return udp_broad_recv_fd;
  127. }
  128. const int opt = 1;
  129. //设置该套接字为广播类型,
  130. ret = setsockopt(udp_broad_recv_fd, SOL_SOCKET, SO_BROADCAST, (char *)&opt, sizeof(opt));
  131. if(ret < 0)
  132. {
  133. perror("udp_broad_recv_from->setsockopt\nError:");
  134. return ret;
  135. }
  136. sin.sin_family = AF_INET;
  137. sin.sin_port = htons(port);
  138. sin.sin_addr.s_addr = htonl(ip);//inet_addr(ip);
  139. bzero(sin.sin_zero, 8);
  140. do{
  141. ret = bind(udp_broad_recv_fd, (struct sockaddr*)&sin, sizeof(sin));
  142. if (ret < 0) {
  143. perror("udp_broad_recv_from->bind\nError:");
  144. udp_info_check(&sin);
  145. sleep(1);
  146. }
  147. }
  148. while (ret < 0);
  149. struct msg_udp msg_buf;
  150. struct sockaddr cin_in;
  151. socklen_t addrlen= sizeof(cin_in);
  152. bzero(&msg_buf, sizeof(msg_buf));
  153. bzero(&cin_in, addrlen);
  154. ret = recvfrom(udp_broad_recv_fd, &msg_buf, sizeof(msg_buf), 0, &cin_in, &addrlen);
  155. if (ret < 0) {
  156. perror("udp_broad_recv_from->recvfrom\nError:");
  157. return ret;
  158. }
  159. memcpy(recv_msg, &msg_buf, sizeof(msg_buf));
  160. memcpy(online_cin, &cin_in, addrlen);
  161. close(udp_broad_recv_fd);
  162. return 1;
  163. }
  164. /* 发送(IP,端口,信息) */
  165. extern char udp_broad_send_to(uint32_t ip, unsigned int port, struct msg_udp *str, int size_str)
  166. {
  167. int ret = -1;
  168. struct sockaddr_in sin;
  169. int udp_broad_send_fd;
  170. udp_broad_send_fd = socket(AF_INET, SOCK_DGRAM, 0);
  171. const int opt = 1;
  172. //设置该套接字为广播类型,
  173. ret = setsockopt(udp_broad_send_fd, SOL_SOCKET, SO_BROADCAST, (char *)&opt, sizeof(opt));
  174. if(ret < 0)
  175. {
  176. perror("udp_broad_send_to->setsockopt\nError:");
  177. return ret;
  178. }
  179. sin.sin_family = AF_INET;
  180. sin.sin_port = htons(port);
  181. sin.sin_addr.s_addr = htonl(ip); //inet_addr(ip);
  182. bzero(sin.sin_zero, 8);
  183. ret = sendto(udp_broad_send_fd, str, size_str, 0, (struct sockaddr*)&sin, sizeof(sin));
  184. if (ret < 0) {
  185. perror("udp_broad_send_to->sendto\nError:");
  186. udp_info_check(&sin);
  187. return ret;
  188. }
  189. close(udp_broad_send_fd);
  190. return 1;
  191. }
  192. #endif