You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

101 lines
4.0 KiB

2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
  1. #include "xs_udp.h"
  2. #include "xs_log.h"
  3. #define TAG "xs_udp"
  4. #define UDP_DEFAULT_SEND_PORT 5000
  5. #define SOCKET_DO(function) \
  6. do { \
  7. int ret = function; \
  8. if (ret) { \
  9. ZLOGE(TAG, "do %s fail", #function); \
  10. return false; \
  11. } \
  12. } while (0)
  13. static void udp_server_receive_thread(void const *argument) { //
  14. udp_t *udp_handler = (udp_t *)argument;
  15. while (true) {
  16. struct sockaddr_in sock;
  17. socklen_t sock_len = sizeof(sock);
  18. int recv_datalen = recvfrom(udp_handler->sock_fd, (char *)udp_handler->rxbuf, udp_handler->rxbuf_len, 0, (struct sockaddr *)&sock, &sock_len);
  19. if (recv_datalen > 0) {
  20. if (udp_handler->on_packet) udp_handler->on_packet(udp_handler, &sock, (uint8_t *)udp_handler->rxbuf, recv_datalen);
  21. }
  22. }
  23. }
  24. bool xs_udp_init(udp_t *udp_handler, uint16_t port, udp_on_packet_t on_packet, int32_t rxbuf_size, void *data) {
  25. memset(udp_handler, 0, sizeof(udp_t));
  26. udp_handler->server.sin_family = AF_INET;
  27. udp_handler->server.sin_addr.s_addr = inet_addr("0.0.0.0");
  28. udp_handler->server.sin_port = htons(port);
  29. udp_handler->on_packet = on_packet;
  30. udp_handler->data = data;
  31. if (rxbuf_size == 0) {
  32. udp_handler->rxbuf_len = 1024;
  33. } else {
  34. udp_handler->rxbuf_len = rxbuf_size;
  35. }
  36. udp_handler->rxbuf = (char *)malloc(udp_handler->rxbuf_len);
  37. ZASSERT(udp_handler->rxbuf != NULL);
  38. // �����ͻ�������ͨ�ŵ�Socket
  39. udp_handler->sock_fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
  40. if (udp_handler->sock_fd < 0) {
  41. ZLOGE(TAG, "create socket fail");
  42. return false;
  43. }
  44. // ���ó�ʱ
  45. struct timeval tv = {0, 1000};
  46. SOCKET_DO(lwip_setsockopt(udp_handler->sock_fd, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(tv)));
  47. // ����
  48. SOCKET_DO(bind(udp_handler->sock_fd, (struct sockaddr *)&udp_handler->server, sizeof(udp_handler->server)));
  49. if (on_packet) {
  50. // ���������߳�
  51. osThreadDef(udp_server_rx_thread, udp_server_receive_thread, osPriorityBelowNormal, 0, 512);
  52. udp_handler->rx_thread = osThreadCreate(osThread(udp_server_rx_thread), udp_handler);
  53. ZASSERT(udp_handler->rx_thread != NULL);
  54. }
  55. return true;
  56. }
  57. int xs_udp_send_message(udp_t *udp_handler, const char *ip, int port, const char *data, int len) { //
  58. struct sockaddr_in sockaddr;
  59. sockaddr.sin_family = AF_INET;
  60. sockaddr.sin_addr.s_addr = inet_addr(ip);
  61. sockaddr.sin_port = htons(port);
  62. return sendto(udp_handler->sock_fd, data, len, 0, (struct sockaddr *)&sockaddr, sizeof(sockaddr));
  63. }
  64. int xs_udp_send_message2(udp_t *udp_handler, struct sockaddr_in *add, const char *data, int len) { //
  65. return sendto(udp_handler->sock_fd, data, len, 0, (struct sockaddr *)add, sizeof(struct sockaddr_in));
  66. }
  67. bool xs_udp_broadcast_init(udp_broadcast_handler_t *udp_handler, uint16_t localport) {
  68. memset(udp_handler, 0, sizeof(udp_broadcast_handler_t));
  69. udp_handler->server.sin_family = AF_INET;
  70. udp_handler->server.sin_addr.s_addr = inet_addr("0.0.0.0");
  71. udp_handler->server.sin_port = htons(localport);
  72. // �����ͻ�������ͨ�ŵ�Socket
  73. udp_handler->sock_fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
  74. if (udp_handler->sock_fd < 0) {
  75. ZLOGE(TAG, "create socket fail");
  76. return false;
  77. }
  78. // ���ó�ʱ
  79. struct timeval tv = {0, 1000};
  80. SOCKET_DO(lwip_setsockopt(udp_handler->sock_fd, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(tv)));
  81. // ����
  82. SOCKET_DO(bind(udp_handler->sock_fd, (struct sockaddr *)&udp_handler->server, sizeof(udp_handler->server)));
  83. return true;
  84. }
  85. bool xs_udp_broadcast(udp_broadcast_handler_t *handler, uint32_t remoteport, uint8_t *data, size_t datalen) {
  86. struct sockaddr_in sockaddr;
  87. sockaddr.sin_family = AF_INET;
  88. sockaddr.sin_addr.s_addr = htonl(INADDR_BROADCAST);
  89. sockaddr.sin_port = htons(remoteport);
  90. return sendto(handler->sock_fd, data, datalen, 0, (struct sockaddr *)&sockaddr, sizeof(sockaddr));
  91. }