linux socket 非阻塞设置

int socket_open_connect_ip(const u8 *ip,const u32 port)
{

    int len =  0;
    //int port= 6908;
    int ret;
    struct sockaddr_in addr;


    if(ip!=NULL);
    
    else
        return -100;//no ip
    memset(&addr, 0, sizeof(addr));
    addr.sin_family = AF_INET;    
    addr.sin_port = htons(port);    
    inet_pton(AF_INET, ip, &addr.sin_addr);  

    if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
        {        
    
        close(sockfd);        
        return -1;    
        }    
    fcntl(sockfd,F_SETFL,fcntl(sockfd,F_GETFL,0)|O_NONBLOCK);//设置为非阻塞模式  

    ret = connect(sockfd, (struct sockaddr *)&addr, sizeof(struct sockaddr));    
   

    if (ret != 0 )  
    {  
        if(errno != EINPROGRESS)  
         eTRACE("connect error :%s\n",strerror(errno)); 
        else  
        {  
            struct timeval tm = {10, 0};  
            fd_set wset,rset;  
            FD_ZERO(&wset);  
            FD_ZERO(&rset);  
            FD_SET(sockfd,&wset);  
            FD_SET(sockfd,&rset);  
            long t1 = time(NULL);  
            int res = select(sockfd+1,&rset,&wset,NULL,&tm);  
            long t2 = time(NULL);  
              eTRACE("interval time: %ld\n", t2 - t1);  
            if(res < 0)  
            {  
           
            }  
            else if(res == 0)  
            {  
             
            }  
            else if (1 == res)  
            {  
                if(FD_ISSET(sockfd,&wset))  
                {  
          
                    fcntl(sockfd,F_SETFL,fcntl(sockfd,F_GETFL,0) & ~O_NONBLOCK);  
                    ret = 0;  
                    return ret;
                }  
                else  
                {  
           
                }  
            }  
        }  
    }  
      if(ret<0)
        close(sockfd);

    return ret;

}

发布了20 篇原创文章 · 获赞 4 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/zhuimenglushang/article/details/82423146