为什么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判断啊,直到连接上才停止尝试,如果连接不上等待若干时间重试,另外对尝试设置个上限次数,超过次数再报错。