1、动手写了个socket,很久没写了,凑合写了个,欢迎大家下载测试,直接下载放到板子里面运行就行了。测试方式就是,本程序是服务器,IP地址是你板子的地址,端口号是8888。
所以可以使用TCPUDP Debug工具打开创建连接,地址是板子的地址,端口8888,点击连接即可,细节看图,有说明。
2、贴点主要代码片段,供大家学习用
超时处理,建议用心的同学用链表来管理客户端已连接的socket,我偷懒了,简单处理。
- /* 服务器SOCKET超时处理--关闭超时的连接 */
- #if ENABLE_SVR_SOCKET_TIMEOUT
- for (n=0; n<SERVER_MAX_LINK_NUM; n++) {
- if ( _is_SecTick_Overflow(n, SERVER_SOCKET_TIMEOUT_SEC) ) {
- if (svr_socket_list[n] > 0) {
- printf("#Client timeout closed\n");
- close(svr_socket_list[n]);
- /*
- * 注意此处FD处理**IMPORTANT**
- * 删除客户端socket连接保持列表中当前超时的socket,把最后一个移到该位置,删除最后一个
- */
- FD_CLR(svr_socket_list[n], &fdsr);
- svr_socket_list[n] = svr_socket_list[connection_cnt-1];
- svr_socket_list[connection_cnt-1] = -1;
- connection_cnt--;
- }
- }
- }
- #endif
3、关于超时函数,简单线程方式实现,linux有定时器可用,不太喜欢。
- /* Local Functions -----------------------------------------------------------*/
- static long SecTick[SERVER_MAX_LINK_NUM];
- /**
- * @brief secTick_Thread
- * @note 秒滴答线程
- * @param None
- * @retval None
- */
- void *_secTick_Thread(void *argv)
- {
- int i=0;
-
- while (1) {
- sleep(1);
- for (i=0; i<SERVER_MAX_LINK_NUM; i++) {
- SecTick[i]++;
- }
- }
- }
- /**
- * @brief _get_SecTick
- * @note 获取秒滴答数
- * @param None
- * @retval None
- */
- long _get_SecTick(int index)
- {
- if (index < SERVER_MAX_LINK_NUM) {
- return SecTick[index];
- } else {
- return 0;
- }
- }
- /**
- * @brief _clean_SecTick
- * @note 清除秒滴答数
- * @param None
- * @retval None
- */
- void _clean_SecTick(int index)
- {
- if (index < SERVER_MAX_LINK_NUM) {
- SecTick[index] = 0;
- }
- }
- /**
- * @brief _is_SecTick_Overflow
- * @note 秒滴答是否溢出
- * @param None
- * @retval None
- */
- uint8_t _is_SecTick_Overflow(int index, long target)
- {
- if ( _get_SecTick(index) >= target ) {
- SecTick[index] = 0;
- return 1;
- } else {
- return 0;
- }
- }
- /**
- * @brief _start_secTick_Thread
- * @note 启动秒滴答
- * @param None
- * @retval None
- */
- void _start_secTick_Thread(void)
- {
- pthread_t sec_tick_id;
-
- if ( pthread_create(&sec_tick_id, NULL, &_secTick_Thread, NULL) != 0 ) {
- printf("Create secTick Thread failure\n");
- }
- }
4、详细测试图,如下,可以看一下图上面的说明
1)连接
2)超时关闭,注意该socket通讯的时候超时计数器会重新计数。
3)最大连接,可以通过宏设置服务器最大支持的连接数
4)主动打开关闭某个连接
5)通讯测试,开灯
6)通讯测试,查询灯状态