net_test.c 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282
  1. /*
  2. * Net Test Utilities for RT-Thread
  3. */
  4. #include <rtthread.h>
  5. #include <finsh.h>
  6. #include <lwip/api.h>
  7. #include <lwip/sockets.h>
  8. /*
  9. * UDP echo server
  10. */
  11. #define UDP_ECHO_PORT 7
  12. rt_thread_t udpecho_tid = RT_NULL;
  13. void udpecho_entry(void *parameter)
  14. {
  15. struct netconn *conn;
  16. struct netbuf *buf;
  17. struct ip_addr *addr;
  18. unsigned short port;
  19. conn = netconn_new(NETCONN_UDP);
  20. netconn_bind(conn, IP_ADDR_ANY, 7);
  21. while(1)
  22. {
  23. /* received data to buffer */
  24. buf = netconn_recv(conn);
  25. addr = netbuf_fromaddr(buf);
  26. port = netbuf_fromport(buf);
  27. /* send the data to buffer */
  28. netconn_connect(conn, addr, port);
  29. /* reset address, and send to client */
  30. buf->addr = RT_NULL;
  31. netconn_send(conn, buf);
  32. /* release buffer */
  33. netbuf_delete(buf);
  34. }
  35. }
  36. /*
  37. * UDP socket echo server
  38. */
  39. #define UDP_SOCKET_ECHO_PORT 700
  40. #define UDP_SOCKET_BUFFER_SIZE 4096
  41. rt_thread_t udpecho_socket_tid = RT_NULL;
  42. void udpecho_socket_entry(void *parameter)
  43. {
  44. int sock;
  45. int bytes_read;
  46. char *recv_data;
  47. rt_uint32_t addr_len;
  48. struct sockaddr_in server_addr, client_addr;
  49. /* allocate the data buffer */
  50. recv_data = rt_malloc(UDP_SOCKET_BUFFER_SIZE);
  51. if (recv_data == RT_NULL)
  52. {
  53. /* no memory yet */
  54. rt_kprintf("no memory\n");
  55. goto _exit;
  56. }
  57. /* create a UDP socket */
  58. if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
  59. {
  60. rt_kprintf("create socket error\n");
  61. goto _exit;
  62. }
  63. /* initialize server address */
  64. server_addr.sin_family = AF_INET;
  65. server_addr.sin_port = htons(UDP_SOCKET_ECHO_PORT);
  66. server_addr.sin_addr.s_addr = INADDR_ANY;
  67. rt_memset(&(server_addr.sin_zero),0, sizeof(server_addr.sin_zero));
  68. /* bind socket to server address */
  69. if (bind(sock,(struct sockaddr *)&server_addr,
  70. sizeof(struct sockaddr)) == -1)
  71. {
  72. /* bind failed */
  73. rt_kprintf("bind error\n");
  74. goto _exit;
  75. }
  76. addr_len = sizeof(struct sockaddr);
  77. while (1)
  78. {
  79. /* try to receive from UDP socket */
  80. bytes_read = recvfrom(sock, recv_data, UDP_SOCKET_BUFFER_SIZE, 0,
  81. (struct sockaddr *)&client_addr, &addr_len);
  82. /* send back */
  83. sendto(sock, recv_data, bytes_read, 0,
  84. (struct sockaddr *)&client_addr, addr_len);
  85. }
  86. _exit:
  87. rt_free(recv_data);
  88. return;
  89. }
  90. /*
  91. * TCP echo server
  92. */
  93. #define TCP_ECHO_PORT 7
  94. rt_thread_t tcpecho_tid = RT_NULL;
  95. void tcpecho_entry(void *parameter)
  96. {
  97. struct netconn *conn, *newconn;
  98. err_t err;
  99. /* Create a new connection identifier. */
  100. conn = netconn_new(NETCONN_TCP);
  101. /* Bind connection to well known port number 7. */
  102. netconn_bind(conn, NULL, TCP_ECHO_PORT);
  103. /* Tell connection to go into listening mode. */
  104. netconn_listen(conn);
  105. while(1)
  106. {
  107. /* Grab new connection. */
  108. newconn = netconn_accept(conn);
  109. /* Process the new connection. */
  110. if(newconn != NULL)
  111. {
  112. struct netbuf *buf;
  113. void *data;
  114. u16_t len;
  115. while((buf = netconn_recv(newconn)) != NULL)
  116. {
  117. do
  118. {
  119. netbuf_data(buf, &data, &len);
  120. err = netconn_write(newconn, data, len, NETCONN_COPY);
  121. if(err != ERR_OK){}
  122. }
  123. while(netbuf_next(buf) >= 0);
  124. netbuf_delete(buf);
  125. }
  126. /* Close connection and discard connection identifier. */
  127. netconn_delete(newconn);
  128. }
  129. }
  130. }
  131. /*
  132. * TCP socket echo server
  133. */
  134. #define TCP_SOCKET_ECHO_PORT 700
  135. #define TCP_SOCKET_BUFFER_SIZE 4096
  136. rt_thread_t tcpecho_socket_tid = RT_NULL;
  137. void tcpecho_socket_entry(void *parameter)
  138. {
  139. char *recv_data;
  140. rt_uint32_t sin_size;
  141. int sock = -1, connected, bytes_received;
  142. struct sockaddr_in server_addr, client_addr;
  143. recv_data = rt_malloc(TCP_SOCKET_BUFFER_SIZE);
  144. if (recv_data == RT_NULL)
  145. {
  146. rt_kprintf("no memory\n");
  147. goto _exit;
  148. }
  149. /* create a TCP socket */
  150. if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1)
  151. {
  152. rt_kprintf("create socket error\n");
  153. goto _exit;
  154. }
  155. /* initialize server address */
  156. server_addr.sin_family = AF_INET;
  157. server_addr.sin_port = htons(TCP_SOCKET_ECHO_PORT);
  158. server_addr.sin_addr.s_addr = INADDR_ANY;
  159. rt_memset(&(server_addr.sin_zero),8, sizeof(server_addr.sin_zero));
  160. /* bind to server address */
  161. if (bind(sock, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) == -1)
  162. {
  163. rt_kprintf("bind address failed\n");
  164. goto _exit;
  165. }
  166. /* listen */
  167. if (listen(sock, 5) == -1)
  168. {
  169. rt_kprintf("listen error\n");
  170. goto _exit;
  171. }
  172. sin_size = sizeof(struct sockaddr_in);
  173. while(1)
  174. {
  175. /* accept client connected */
  176. connected = accept(sock, (struct sockaddr *)&client_addr, &sin_size);
  177. if (connected > 0)
  178. {
  179. int timeout;
  180. /* set timeout option */
  181. timeout = 5000; /* 5second */
  182. setsockopt(connected, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout));
  183. /* handle this client */
  184. while (1)
  185. {
  186. /* receive data from this connection */
  187. bytes_received = recv(connected,recv_data, TCP_SOCKET_BUFFER_SIZE, 0);
  188. if (bytes_received <= 0)
  189. {
  190. rt_kprintf("close client connection, errno: %d, socket error: %d\n",
  191. rt_get_errno(),
  192. lwip_get_error());
  193. /* connection closed. */
  194. lwip_close(connected);
  195. break;
  196. }
  197. /* send data to client */
  198. send(connected, recv_data, bytes_received, 0);
  199. }
  200. }
  201. }
  202. _exit:
  203. /* close socket */
  204. if (sock != -1) lwip_close(sock);
  205. rt_free(recv_data);
  206. return ;
  207. }
  208. /*
  209. * NetIO TCP server
  210. */
  211. /* network test utilities entry */
  212. void net_test(void)
  213. {
  214. /* start UDP echo server */
  215. if (udpecho_tid == RT_NULL)
  216. {
  217. udpecho_tid = rt_thread_create("uecho",
  218. udpecho_entry, RT_NULL,
  219. 512, RT_THREAD_PRIORITY_MAX/2, 5);
  220. if (udpecho_tid != RT_NULL)
  221. rt_thread_startup(udpecho_tid);
  222. }
  223. if (udpecho_socket_tid == RT_NULL)
  224. {
  225. udpecho_socket_tid = rt_thread_create("uecho_s",
  226. udpecho_socket_entry, RT_NULL,
  227. 512, RT_THREAD_PRIORITY_MAX/2 + 1, 5);
  228. if (udpecho_socket_tid != RT_NULL)
  229. rt_thread_startup(udpecho_socket_tid);
  230. }
  231. if (tcpecho_tid == RT_NULL)
  232. {
  233. tcpecho_tid = rt_thread_create("techo",
  234. tcpecho_entry, RT_NULL,
  235. 512, RT_THREAD_PRIORITY_MAX/2 + 2, 5);
  236. if (tcpecho_tid != RT_NULL)
  237. rt_thread_startup(tcpecho_tid);
  238. }
  239. if (tcpecho_socket_tid == RT_NULL)
  240. {
  241. tcpecho_socket_tid = rt_thread_create("techo_s",
  242. tcpecho_socket_entry, RT_NULL,
  243. 512, RT_THREAD_PRIORITY_MAX/2 + 3, 5);
  244. if (tcpecho_socket_tid != RT_NULL)
  245. rt_thread_startup(tcpecho_socket_tid);
  246. }
  247. }
  248. FINSH_FUNCTION_EXPORT(net_test, network test);