int connect_nb(int sockfd, struct sockaddr *serv_addr, socklen_t addrlen){                                                     
    int             flags, res, error;                                                                                         
    socklen_t       len;                                                                                                       
    struct pollfd   p;                                                                                                         
                                                                                                                               
    if((flags = fcntl(sockfd, F_GETFL, 0)) < 0)                                                                                
        {   syslog(LOG_ERR, "fcntl GETFL failed: %s", strerror(errno));        return -1;    }                                 
    if(fcntl(sockfd, F_SETFL, flags | O_NONBLOCK) < 0)                                                                         
        {   syslog(LOG_ERR, "fcntl SETFL failed: %s", strerror(errno));        return -1;    }                                 
                                                                                                                               
    error = 0;                                                                                                                 
    if((res = connect(sockfd, serv_addr, addrlen)) < 0)  if(errno!=EINPROGRESS)return -1;                                      
                                                                                                                               
    if(res == 0) { /* connect completed immediately (usually localhost) */                                                     
        if(fcntl(sockfd, F_SETFL, flags) < 0)                                                                                  
            {   syslog(LOG_ERR, "fcntl reSETFL failed: %s", strerror(errno));  return -1;     }                                
        return 0;                                                                                                              
    }                                                                                                                          
                                                                                                                               
    memset(&p, 0, sizeof(p));                                                                                                  
    p.fd = sockfd;                                                                                                             
    p.events = POLLOUT;                                                                                                        
    if((res = poll(&p, 1, SERVER_TO * 1000)) != 1) {                                                                           
        if(res == 0) {  errno = ETIMEDOUT;  }   /* timeout */                                                                  
        return -1;                                                                                                             
    }                                                                                                                          
                                                                                                                               
    /* socket is writeable == operation completed */                                                                           
    len = sizeof(error);                                                                                                       
    if(getsockopt(sockfd, SOL_SOCKET, SO_ERROR, &error, &len) < 0)                                                             
        {   syslog(LOG_ERR, "getsockopt failed: %s", strerror(errno));         return -1;    }                                 
                                                                                                                               
    if(fcntl(sockfd, F_SETFL, flags) < 0)     /* restore file status flags */                                                  
        {   syslog(LOG_ERR, "fcntl reSETFL failed: %s", strerror(errno));      return -1;    }                                 
                                                                                                                               
    if(error){  errno = error;  return -1;  }   /* getsockopt() shows an error */                                              
                                                                                                                               
    /* really connected */                                                                                                     
    return 0;                                                                                                                  
} 
    
      Ответ на:
      
          комментарий
        от klalafuda 
  
    
      Ответ на:
      
          комментарий
        от klalafuda 
  
    
      Ответ на:
      
          комментарий
        от cvv 
  

    
      Ответ на:
      
          комментарий
        от Onanim 
  
    
      Ответ на:
      
          комментарий
        от klalafuda 
  
    
        Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.
      
Похожие темы
- Форум connect return -1 errno = 105 (ENOBUFS) (2005)
- Форум В чем ошибка чтения? (2020)
- Форум Помогите найти ошибку в следующем коде!!! (2004)
- Форум 2014-11-17T23:34:13+00:00 kern infoblox kernel[]: info [ 2032.012246] your_daemon forgot to set AF_INET in raw sendmsg. Fix it! (2014)
- Форум не биндится сокет к 80 порту (2017)
- Форум Соединится с сервером по сокету? (2020)
- Форум Непонятки с сокетами (2006)
- Форум И при передаче широко пакета получаю Access denied (2009)
- Форум проблема с сокетами [C] (2009)
- Форум Получение списка интерфейсов через netlink (2013)