完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
我在CC3000上建立一个socket,作为tcp server。
并设置accept为非阻塞,在程序中select传入timeout = 1秒。 整个程序就是在accept和select交替运行。后来我遇到一个现象,就是如果客户端连接之后不进行通讯大约50秒,就会出现CC3000主动断开客户端连接的现象。 而在驱动程序中收不到这个消息。 今天突发奇想,会不会和我用select而不是用recv有关呢。 于是做了一个简单的测试。 sd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if(sd < 0) [ printf("errorn"); return; ] printf("socket :%dn", sd); memset(&tSocketAddr, 0, sizeof(tSocketAddr)); tSocketAddr.sa_family = AF_INET; tSocketAddr.sa_data[0]= (12366)>>8; tSocketAddr.sa_data[1]= (unsigned char)12366; tSocketAddr.sa_data[2]= 0; tSocketAddr.sa_data[3]= 0; tSocketAddr.sa_data[4]= 0; tSocketAddr.sa_data[5]= 0; ret = bind(sd, &tSocketAddr, sizeof(sockaddr)); if(ret < 0) [ printf("errorn"); return; ] ret = listen(sd, 0); if(ret < 0) [ printf("errorn"); ] val = SOCK_ON; ret = setsockopt( sd, SOL_SOCKET, SOCKOPT_ACCEPT_NONBLOCK, &val, sizeof(val)); if(ret == -1) [ return; ] //---------------------------------------------------- timeout.tv_sec = 1; timeout.tv_usec = 0; maxFD = 0; while(1) [ client = accept(sd, &tSocketAddr, &from_len); if(client < 0) [ asm("NOP"); //printf("accept errorn"); ] else [ FD_ZERO(&readsds); FD_SET(client, &readsds); maxFD = client+1; ] if(maxFD == 0) continue; ret = select(maxFD, &readsds, NULL, NULL, &timeout); // Polling instead of blocking here to process "accept" below if(ret == 0) [ //timeout ] else if(ret == -1) [ printf("select errorn"); ] else [ len = recv(maxFD, buf, 1280, 0); if(len < 0) [ asm("NOP"); ] else if(len > 0) [ buf[len] = 0; printf("recv: %sn", buf); asm("NOP"); ] ] ]启动CC3000后程序如上。在网络调试助手中建立一个tcp client连接到CC3000 tcp server,之后不发任何数据。大约50秒回被CC3000断开连接。下面改用recvsd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if(sd < 0) [ printf("errorn"); return; ] printf("socket :%dn", sd); memset(&tSocketAddr, 0, sizeof(tSocketAddr)); tSocketAddr.sa_family = AF_INET; tSocketAddr.sa_data[0]= (12366)>>8; tSocketAddr.sa_data[1]= (unsigned char)12366; tSocketAddr.sa_data[2]= 0; tSocketAddr.sa_data[3]= 0; tSocketAddr.sa_data[4]= 0; tSocketAddr.sa_data[5]= 0; ret = bind(sd, &tSocketAddr, sizeof(sockaddr)); if(ret < 0) [ printf("errorn"); return; ] ret = listen(sd, 0); if(ret < 0) [ printf("errorn"); ] val = SOCK_ON; ret = setsockopt( sd, SOL_SOCKET, SOCKOPT_ACCEPT_NONBLOCK, &val, sizeof(val)); if(ret == -1) [ return; ] //---------------------------------------------------- timeout.tv_sec = 1; timeout.tv_usec = 0; maxFD = 0; while(1) [ client = accept(sd, &tSocketAddr, &from_len); if(client < 0) [ asm("NOP"); //printf("accept errorn"); ] else [ maxFD = client; time_out = 1000; setsockopt(maxFD, SOL_SOCKET, SOCKOPT_RECV_TIMEOUT, &time_out, sizeof(time_out)); ] if(maxFD == 0) continue; len = recv(maxFD, buf, 1280, 0); if(len < 0) [ asm("NOP"); ] else if(len > 0) [ buf[len] = 0; printf("recv: %sn", buf); asm("NOP"); ]]此时不通讯是就会不会出现被CC3000断开的现象。当然上述测试只针对一个客户端。发给大家参考一下。毕竟同时天涯沦落人啊。附一笑话:你会编程,而他们不会,这他妈的酷比了。 |
|
相关推荐
3个回答
|
|
多谢楼主分享
|
|
|
|
|
|
|
|
多谢分享
|
|
|
|
只有小组成员才能发言,加入小组>>
344 浏览 1 评论
539 浏览 2 评论
NA555DR VCC最低电压需要在5V供电,为什么用3.3V供电搭了个单稳态触发器也使用正常?
783 浏览 3 评论
MSP430F249TPMR出现高温存储后失效了的情况,怎么解决?
655 浏览 1 评论
对于多级放大电路板,在PCB布局中,电源摆放的位置应该注意什么?
1138 浏览 1 评论
AT32F407在USART2 DMA发送数据时,接包接到了要发送的数据,程序还是处于等待传输完成的标识判断中,为什么?
70浏览 29评论
224浏览 23评论
请问下tpa3220实际测试引脚功能和官方资料不符,哪位大佬可以帮忙解答下
258浏览 20评论
请教下关于TAS5825PEVM评估模块原理图中不太明白的地方,寻求答疑
205浏览 14评论
两个TMP117传感器一个可以正常读取温度值,一个读取的值一直是0,为什么?
65浏览 13评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-25 17:33 , Processed in 0.967197 second(s), Total 83, Slave 67 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号