2011-06-01 14 views
9

में मैं समारोह के टाइमआउट मान सेट करने के लिए कनेक्ट चाहते हैं, लेकिन मैं इस त्रुटि मिलती है: "ऑपरेशन अब प्रगति में"ऑपरेशन अब कनेक्ट (समारोह) पर प्रगति त्रुटि त्रुटि

मेरे कोड:

if ((he = gethostbyname(authdefhost)) == NULL) { 
     snprintf(errbuf, CERRBUFSIZ - 1, "cannot resolve %s: %s\n", authdefhost, hstrerror(h_errno)); 
     return -1; 
} 

sin.sin_family = AF_INET; 
memcpy(&sin.sin_addr, he->h_addr_list[0], sizeof(struct in_addr));  

if ((sd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { 
     snprintf(errbuf, CERRBUFSIZ - 1, "cannot create client socket: %s\n", strerror(errno)); 
     return -1; 
} 

if ((fcntl(sd, F_SETFL, O_NONBLOCK) < 0)) 
    printf("error on setting socket flags."); 

if (connect(sd, (void *) & sin, sizeof(sin)) == -1) { 
     snprintf(errbuf, CERRBUFSIZ - 1, "cannot connect to server %s: %s\n", authdefhost, strerror(errno)); 
     close(sd); 
     return -1; 
} 

FD_ZERO(&fdset); 
FD_SET(sd, &fdset); 
int rv; 
if ((rv = select(sd + 1, NULL, &fdset, NULL, &tv)) == -1) { 
    printf("error occurred on select function."); 
    return -1; 
} 
else if (rv == 0) { 
    printf("time out occurred."); 
    return -1; 
} 
else { 
    printf("connection established"); 
    return sd; 
} 

उत्तर

24

जब आप गैर-अवरुद्ध सॉकेट पर connect() पर कॉल करते हैं, तो कनेक्शन कनेक्शन हैंडशेक को पूरा करने के लिए प्रतीक्षा करने के बजाय आपको EINPROGRESS मिल जाएगा। फिर, आपको select() उत्तरदायित्व के लिए है, और यह देखने के लिए सॉकेट त्रुटि जांचें कि कनेक्शन पूरा हो गया है या नहीं।

लिनक्स के connect() manpage से:

EINPROGRESS 

    The socket is nonblocking and the connection cannot be completed 
    immediately. It is possible to select(2) or poll(2) for completion by 
    selecting the socket for writing. After select(2) indicates 
    writability, use getsockopt(2) to read the SO_ERROR option at level 
    SOL_SOCKET to determine whether connect() completed successfully 
    (SO_ERROR is zero) or unsuccessfully (SO_ERROR is one of the usual 
    error codes listed here, explaining the reason for the failure). 

+6

संक्षेप में: यह आशा की जाती है। 'कनेक्ट() 'के लिए आपको अपने त्रुटि-जांच पथ में विशेष रूप से' errno! = EINPROGRESS' 'की जांच करनी होगी। – caf

+1

* अध्याय 16 यूनिक्स नेटवर्क प्रोग्रामिंग (वॉल्यूम 1) के अनब्लॉकिंग I/O * ** इस सुविधा का विवरण विस्तार से वर्णन करें और एक डेमो प्रस्तुत करें। – diabloneo

संबंधित मुद्दे