[讨论] help2416_socket_server_欢迎测试

lyzhangxiang   2014-8-9 17:37 楼主
1、动手写了个socket,很久没写了,凑合写了个,欢迎大家下载测试,直接下载放到板子里面运行就行了。测试方式就是,本程序是服务器,IP地址是你板子的地址,端口号是8888。
所以可以使用TCPUDP Debug工具打开创建连接,地址是板子的地址,端口8888,点击连接即可,细节看图,有说明。


2、贴点主要代码片段,供大家学习用

超时处理,建议用心的同学用链表来管理客户端已连接的socket,我偷懒了,简单处理。
  1.   /* 服务器SOCKET超时处理--关闭超时的连接 */
  2.                 #if ENABLE_SVR_SOCKET_TIMEOUT
  3.                                 for (n=0; n<SERVER_MAX_LINK_NUM; n++) {
  4.                                                 if ( _is_SecTick_Overflow(n, SERVER_SOCKET_TIMEOUT_SEC) ) {
  5.                                                         if (svr_socket_list[n] > 0) {
  6.                                                                         printf("#Client timeout closed\n");
  7.                                                                         close(svr_socket_list[n]);
  8.                                                                         /*
  9.                                                                          * 注意此处FD处理**IMPORTANT**
  10.                                                                          * 删除客户端socket连接保持列表中当前超时的socket,把最后一个移到该位置,删除最后一个
  11.                                                                          */
  12.                                                                         FD_CLR(svr_socket_list[n], &fdsr);
  13.                                                                         svr_socket_list[n] = svr_socket_list[connection_cnt-1];
  14.                                                                         svr_socket_list[connection_cnt-1] = -1;
  15.                                                                         connection_cnt--;
  16.                                                                 }
  17.                                                 }
  18.                                 }
  19.                 #endif



3、关于超时函数,简单线程方式实现,linux有定时器可用,不太喜欢。
  1. /* Local Functions -----------------------------------------------------------*/

  2. static long SecTick[SERVER_MAX_LINK_NUM];

  3. /**
  4. * @brief  secTick_Thread
  5. * @note   秒滴答线程
  6. * @param  None
  7. * @retval None
  8. */
  9. void *_secTick_Thread(void  *argv)
  10. {
  11.         int i=0;
  12.         
  13.         while (1) {
  14.                 sleep(1);
  15.                 for (i=0; i<SERVER_MAX_LINK_NUM; i++) {
  16.                         SecTick[i]++;
  17.                 }
  18.         }
  19. }

  20. /**
  21. * @brief  _get_SecTick
  22. * @note   获取秒滴答数
  23. * @param  None
  24. * @retval None
  25. */
  26. long _get_SecTick(int index)
  27. {
  28.         if (index < SERVER_MAX_LINK_NUM) {
  29.                 return SecTick[index];
  30.         } else {
  31.                 return 0;
  32.         }
  33. }


  34. /**
  35. * @brief  _clean_SecTick
  36. * @note   清除秒滴答数
  37. * @param  None
  38. * @retval None
  39. */
  40. void _clean_SecTick(int index)
  41. {
  42.         if (index < SERVER_MAX_LINK_NUM) {
  43.                 SecTick[index] = 0;
  44.         }
  45. }

  46. /**
  47. * @brief  _is_SecTick_Overflow
  48. * @note   秒滴答是否溢出
  49. * @param  None
  50. * @retval None
  51. */
  52. uint8_t _is_SecTick_Overflow(int index, long target)
  53. {
  54.         if ( _get_SecTick(index) >= target ) {
  55.                 SecTick[index] = 0;
  56.                 return 1;
  57.         } else {
  58.                 return 0;
  59.         }
  60. }


  61. /**
  62. * @brief  _start_secTick_Thread
  63. * @note   启动秒滴答
  64. * @param  None
  65. * @retval None
  66. */
  67. void _start_secTick_Thread(void)
  68. {
  69.         pthread_t sec_tick_id;
  70.         
  71.         if ( pthread_create(&sec_tick_id, NULL, &_secTick_Thread, NULL) != 0 ) {
  72.                 printf("Create secTick Thread failure\n");
  73.         }
  74. }



4、详细测试图,如下,可以看一下图上面的说明

1)连接
connect.jpg

2)超时关闭,注意该socket通讯的时候超时计数器会重新计数。
timeout close.jpg

3)最大连接,可以通过宏设置服务器最大支持的连接数
max link.jpg

4)主动打开关闭某个连接
close link.jpg

5)通讯测试,开灯
open.jpg

6)通讯测试,查询灯状态
queue.jpg


电工

回复评论

暂无评论,赶紧抢沙发吧
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复