为什么accept函数时候会接收不到新的连接?
时间:10-02
整理:3721RD
点击:
大家好,我使用CC3000与笔记本进行tcp连接的数据通讯。
cc3000 --> 服务器
笔记本 --> 客户端
有时候会有收不到客户端发来的连接请求,一直在下面的while循环里,阻塞和非阻塞的接收方式都试过了,bind\listen函数返回值都正常
当客户端调用connect时
cc3000阻塞方式:阻塞直到连接超时,放回-1.如果继续accept,仍然阻塞着,然后返回-1; 需要客户端调用好几次connect才会接收到,甚至有时候会一直都接收不到。
cc3000非阻塞方式:情况与阻塞类似,但这个是立即返回-2.知道客户端显示连接超时,cc3000也都没能接收到连接。
这样的话,我客户端不得不进行多次调用connect才能连上服务器。这是为什么呢?
while(ulCC3000Connected)
{
i = 0;
while(ulCC3000Connected)
{
val = SOCK_OFF;
ret = 1;
while(ret != 0)
{
ret = setsockopt(fd,SOL_SOCKET,SOCKOPT_ACCEPT_NONBLOCK,&val,sizeof(socklen_t));
}
Delay(10);
memset((char *)&remote_addr,0,sizeof(sockaddr));
sockLen = sizeof(sockaddr);
connect_fd = accept(fd,(sockaddr*)&remote_addr,&sockLen);
if(connect_fd > 0)
{
ulClient_Status = 1;
break;
}
Delay(10);
}
timeout.tv_sec = 1;
timeout.tv_usec = 0;//超时时间 (微妙)
FD_ZERO(&readsds);
FD_ZERO(&exceptsds);
FD_ZERO(&writesds);
FD_SET(connect_fd,&exceptsds);
FD_SET(connect_fd,&writesds);
while(ulClient_Status && ulCC3000Connected)
{
i = 2;
FD_ZERO(&readsds);
FD_SET(connect_fd,&readsds);
ret = select(connect_fd+1,&readsds,NULL,NULL,&timeout);
if(ret == 0)
{
Delay(100);
continue;
}
if(ret <0)
{
while(1)
{
}
}
ret = tese_sock_send_and_recv(connect_fd);
if(ret <= 0)
{
Delay(50);
continue;
}
}
ret = closesocket(connect_fd);
// ret = closesocket(fd);
// Delay(500);
}
不清楚啊,不过根据多次尝试就可以连接上,这跟手机有点相似啊,我的手机就是WIFI有时候连接不上,尝试很多次才连接上。。。
你可以弄个while判断啊,直到连接上才停止尝试,如果连接不上等待若干时间重试,另外对尝试设置个上限次数,超过次数再报错。
