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断开的现象。
当然上述测试只针对一个客户端。
发给大家参考一下。毕竟同时天涯沦落人啊。
附一笑话:
你会编程,而他们不会,这他妈的酷比了。
多谢楼主分享
谢谢分享:)
