CC3000一个心得分享。
时间:10-02
整理:3721RD
点击:
我在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("error\n"); return; } printf("socket :%d\n", 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("error\n"); return; } ret = listen(sd, 0); if(ret < 0) { printf("error\n"); } 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 error\n"); } 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 error\n"); } else { len = recv(maxFD, buf, 1280, 0); if(len < 0) { asm("NOP"); } else if(len > 0) { buf[len] = 0; printf("recv: %s\n", buf); asm("NOP"); } } }
启动CC3000后程序如上。在网络调试助手中建立一个tcp client连接到CC3000 tcp server,之后不发任何数据。大约50秒回被CC3000断开连接。
下面改用recv
sd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if(sd < 0) { printf("error\n"); return; } printf("socket :%d\n", 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("error\n"); return; } ret = listen(sd, 0); if(ret < 0) { printf("error\n"); } 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 error\n"); } 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: %s\n", buf); asm("NOP"); } }
此时不通讯是就会不会出现被CC3000断开的现象。
当然上述测试只针对一个客户端。
发给大家参考一下。毕竟同时天涯沦落人啊。
附一笑话:
你会编程,而他们不会,这他妈的酷比了。
多谢楼主分享
谢谢分享:)