微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI WIFI设计交流 > 为什么accept函数时候会接收不到新的连接?

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

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top