硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1554|回复: 1
收起左侧

[NetX] 分享Netxduo 监听多个客户端连接

[复制链接]

5

主题

16

回帖

31

积分

新手上路

积分
31
发表于 2021-4-10 15:03:06 | 显示全部楼层 |阅读模式
项目需要用到tcp socket监听多个port,在外网的论坛上找到一个类似的,tcp创建多个socket监听同一个port,分享给有需要的坛友。
源链接:https://renesasrulz.com/synergy/ ... p-client-connection
  1. #include "tcp_thread.h"

  2. #include "rtt/SEGGER_RTT.h"

  3. #define APP_TCP_SOCKET_NUM      (3)
  4. #define APP_TCP_PORT            (5000)
  5. #define APP_TCP_INSTANT_ECHO    (1)
  6. #define APP_TCP_RTT_LOG         (1)

  7. static NX_TCP_SOCKET g_tcp_sck[APP_TCP_SOCKET_NUM];

  8. static ULONG g_not_listening = TX_FALSE;

  9. static void g_tcp_sck_listen_cb(NX_TCP_SOCKET *, UINT);
  10. static void g_tcp_sck_receive_cb(NX_TCP_SOCKET *);
  11. static void g_tcp_sck_disconn_cb(NX_TCP_SOCKET *);

  12. /* TCP Thread entry function */
  13. void tcp_thread_entry(void)
  14. {
  15.     UINT status;

  16.     /* Create all sockets */
  17.     for (INT i = 0; i < APP_TCP_SOCKET_NUM; i++)
  18.     {
  19.         status = nx_tcp_socket_create(&g_ip, g_tcp_sck + i, "TCP Socket",
  20.                                       NX_IP_NORMAL, NX_FRAGMENT_OKAY,
  21.                                       NX_IP_TIME_TO_LIVE, 512, NX_NULL,
  22.                                       g_tcp_sck_disconn_cb);
  23.         if (NX_SUCCESS != status)
  24.         {
  25.             __BKPT(0);
  26.         }
  27.     }

  28. #if APP_TCP_RTT_LOG
  29.     SEGGER_RTT_printf(0, "Created %u TCP socket%s on port %lu\n",
  30.                       APP_TCP_SOCKET_NUM, APP_TCP_SOCKET_NUM > 1 ? "s" : "",
  31.                       APP_TCP_PORT);
  32. #endif

  33.     /* Start listening on the first socket */
  34.     status = nx_tcp_server_socket_listen(&g_ip, APP_TCP_PORT, g_tcp_sck, 0,
  35.                                          g_tcp_sck_listen_cb);
  36.     if (NX_SUCCESS != status)
  37.     {
  38.         __BKPT(0);
  39.     }

  40.     while (1)
  41.     {
  42. #if APP_TCP_INSTANT_ECHO
  43.         /* Everything else is handled from TCP callbacks dispatched from
  44.          * IP instance thread */
  45.         tx_thread_suspend(tx_thread_identify());
  46. #else
  47.         /* Receive pointers to TCP socket and network packet from
  48.          * TCP callback */
  49.         ULONG msg[2];
  50.         status = tx_queue_receive(&g_tcp_q, msg, TX_WAIT_FOREVER);

  51.         if (TX_SUCCESS == status)
  52.         {
  53.             NX_TCP_SOCKET * p_sck    = (NX_TCP_SOCKET *) msg[0];
  54.             NX_PACKET     * p_packet = (NX_PACKET *)     msg[1];

  55.             status = nx_tcp_socket_send(p_sck, p_packet, NX_NO_WAIT);
  56.             if (NX_SUCCESS != status)
  57.             {
  58.                 nx_packet_release(p_packet);
  59.             }
  60.         }

  61.         else
  62.         {
  63.             /* Unrecoverable error */
  64.             tx_thread_suspend(tx_thread_identify());
  65.         }
  66. #endif
  67.     }
  68. }


  69. static void g_tcp_sck_listen_cb(NX_TCP_SOCKET * p_sck, UINT port)
  70. {
  71.     /* Incoming connection, accept and queueing new requests */
  72.     nx_tcp_server_socket_accept(p_sck, NX_NO_WAIT);
  73.     nx_tcp_server_socket_unlisten(&g_ip, port);
  74.     nx_tcp_socket_receive_notify(p_sck, g_tcp_sck_receive_cb);

  75. #if APP_TCP_RTT_LOG
  76.     ULONG ip, client_port;
  77.     nx_tcp_socket_peer_info_get(p_sck, &ip, &client_port);
  78.     SEGGER_RTT_printf(0, "[TCP %x] Incoming connection from %lu.%lu.%lu.%lu:%lu\n",
  79.                       p_sck, (ip >> 24) & 0xFF, (ip >> 16) & 0xFF,
  80.                       (ip >> 8) & 0xFF, (ip) & 0xFF, client_port);
  81. #endif

  82.     /* Attempt to find another idle socket to start listening on */
  83.     ULONG state = 0;

  84.     for (INT i = 0; i < APP_TCP_SOCKET_NUM; i++)
  85.     {
  86.         /* Get socket state value */
  87.         nx_tcp_socket_info_get(g_tcp_sck + i,
  88.                                0, 0, 0, 0, 0, 0, 0, &state, 0, 0, 0);

  89.         /* Start lisnening if socket is idle */
  90.         if (NX_TCP_CLOSED == state)
  91.         {
  92.             nx_tcp_server_socket_listen(&g_ip, port, g_tcp_sck + i, 0,
  93.                                         g_tcp_sck_listen_cb);

  94.             break;
  95.         }
  96.     }

  97.     /* Ran out of sockets, set appropriate flag to let next socket to
  98.      * disconnect know that it should start listening right away. */
  99.     if (NX_TCP_CLOSED != state)
  100.     {
  101.         g_not_listening = TX_TRUE;
  102.     }
  103. }


  104. static void g_tcp_sck_receive_cb(NX_TCP_SOCKET * p_sck)
  105. {
  106.     NX_PACKET * p_packet;

  107.     /* This callback is invoked when data is already received. Retrieving
  108.      * packet with no suspension. */
  109.     nx_tcp_socket_receive(p_sck, &p_packet, NX_NO_WAIT);

  110. #if APP_TCP_RTT_LOG
  111.     ULONG ip, client_port;
  112.     nx_tcp_socket_peer_info_get(p_sck, &ip, &client_port);
  113.     SEGGER_RTT_printf(0, "[TCP %x] Incoming packet (%lu bytes) from %lu.%lu.%lu.%lu:%lu\n",
  114.                       p_sck, p_packet->nx_packet_length, (ip >> 24) & 0xFF,
  115.                       (ip >> 16) & 0xFF, (ip >> 8) & 0xFF, (ip) & 0xFF, client_port);
  116. #endif

  117. #if APP_TCP_INSTANT_ECHO
  118.     /* Send packet back on the same TCP socket */
  119.     nx_tcp_socket_send(p_sck, p_packet, NX_NO_WAIT);
  120. #else
  121.     ULONG msg[2] =
  122.     {
  123.         (ULONG) p_sck, (ULONG) p_packet
  124.     };

  125.     /* Sent TCP socket and packet pointers to user thread */
  126.     if (TX_SUCCESS != tx_queue_send(&g_tcp_q, msg, TX_NO_WAIT))
  127.     {
  128.         nx_packet_release(p_packet);
  129.     }
  130. #endif
  131. }


  132. static void g_tcp_sck_disconn_cb(NX_TCP_SOCKET * p_sck)
  133. {
  134. #if APP_TCP_RTT_LOG
  135.     SEGGER_RTT_printf(0, "[TCP %x] Client disconnected\n", p_sck);
  136. #endif

  137.     nx_tcp_server_socket_unaccept(p_sck);

  138.     /* If all sockets are busy, start listening again */
  139.     if (TX_TRUE == g_not_listening)
  140.     {
  141.         nx_tcp_server_socket_listen(&g_ip, APP_TCP_PORT, p_sck, 0,
  142.                                     g_tcp_sck_listen_cb);

  143.         g_not_listening = TX_FALSE;
  144.     }
  145. }
复制代码



评分

参与人数 1金币 +50 收起 理由
eric2013 + 50

查看全部评分

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
发表于 2021-4-10 15:36:15 | 显示全部楼层
谢谢分享
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-29 12:46 , Processed in 0.191675 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表