2012-04-18 20 views
8

मेरा एप्लिकेशन एक टीसीपी कनेक्शन बनाता है, यह मानक काम कर रहा है। लेकिन एक नेटवर्क में सर्वर कई आईपी कहना हैटीसीपी कनेक्ट त्रुटि 115 प्रगति में ऑपरेशन कारण क्या है?

  • 174.XXX
  • 54.xxx इस

की तरह जब बुला टीसीपी आईपी से कनेक्ट (नॉन 60 सेकंड के समय समाप्ति के साथ अवरुद्ध) 174.X.X.X हमेशा सफलता है। लेकिन आईपी 54.x.x.x के साथ टीसीपी उसी सर्वर से कनेक्ट होता है जो त्रुटि (115)प्रगति पर मापन ऑपरेशन के साथ विफल रहता है (ज्यादातर बार)। लिनक्स

मेरे टीसीपी conenct कोड

tcp_connect(......) 
{ 

    int iValOpt = 0; 
    int iLength= 0; 

    fcnt((int)(long)SockID,F_SETFL_O_NONBLOCK); 

    ret = connect (sockID,(struct sockaddr*)pstSockAdr,uiSockLen); 

    if (ret < 0) 
    { 

     if (errno == EINPROGRESS) 
     { 
       stTv.tv_sec = 60; 
       stTv.tv_usec = 0; 
       FD_ZERO(&write_fd); 
       FD_SET(sockID,&write_fd); 

       iLength = sizeof(int); 

       if (0 < select (sockID+1) , NULL,&write_fd,NULL,&stTv); 

       { 
         if(0 > getsockopt(sockID,SOL_SOCKET,SO_ERROR,(void*)(&iValOpt),&iLength)) 
         { 
           return -1 
         } 

         if (0 != iValOpt) 
         { 
           return -1; 
         } 


         return success; 
       } 

       else 
       { 
         return -1; 
       } 

     } 
     else 
     { 
       return -1; 
     } 
    } 

    return success; 

} 
+0

अगर आप अपने आवेदन का उपयोग किए बिना 54.x.x.x आईपी से टेलनेट करने की कोशिश क्या होता है? वही व्यवहार? –

+0

नहीं, मैनुअल पुटी एप्लिकेशन ठीक काम करता है – user1340512

+1

'टाइमआउट के साथ गैर-अवरुद्ध' शब्दों में एक विरोधाभास है। – EJP

उत्तर

4

नीचे के रूप में है यह connect() के व्यवहार हो रहा है:

आप कृपया मुझे क्या errno 115

ओएस के लिए संभावित कारण हैं व्याख्या कर सकते हैं :

यदि कनेक्शन तुरंत स्थापित नहीं किया जा सकता है और O_NO NBLOCK सॉकेट के लिए फ़ाइल डिस्क्रिप्टर के लिए सेट है, कनेक्ट() विफल हो जाएगा और [EINPROGRESS] के लिए त्रुटि सेट करें, लेकिन कनेक्शन अनुरोध निरस्त नहीं होगा, और कनेक्शन को अतुल्यकालिक रूप से स्थापित किया जाएगा। कनेक्शन स्थापित होने से पहले, उसी सॉकेट के लिए कनेक्ट() को जोड़ने के बाद के कॉल, असफल हो जाएंगे और [EALREADY] में इरनो सेट करें।

+0

मेरा आवेदन SFTP, उपयोगकर्ता कई एक ही बंदरगाह 22 – user1340512

14

आपकी जानकारी के आधार पर:

  • आप क्या करने की कोशिश कर रहे हैं एक connect()54.x.x.x-
  • सॉकेट है non-blocking
  • कनेक्शन समयबाह्य 60 sec

सबसे पहले है, यदि आप अपने /usr/include/asm-generic/errno.h में देखें, आप निम्न देखेंगे:

#define EINPROGRESS  115  /* Operation now in progress */ 

इसका मतलब है सॉकेट पर एक मौजूदा कार्रवाई जारी है। , जब से तुम ने कहा कि आप एक connect() कॉल कर रहे हैं, की मदद से करते हैं एक man connect:

 
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). 

तो, सबसे अच्छा अनुमान होगा कि टीसीपी 3-जिस तरह से हाथ मिलाना (अपने connect() कॉल 54.x.x.x को IP पता) से अधिक समय ले रहा है पूरा होने की उम्मीद है। चूंकि connect() ऑपरेशन पहले से ही प्रगति पर है, इसलिए सॉकेट पर आने वाले किसी भी ऑपरेशन के परिणामस्वरूप EINPROGRESS त्रुटि कोड होता है। जैसा कि मैन पेज में सुझाया गया है, select() या poll() का उपयोग करने के लिए यह जांचने के लिए कि आपकी सॉकेट उपयोग करने के लिए तैयार है या नहीं (read() या write() कॉल करने के लिए) का उपयोग करने का प्रयास करें।

आप अपने टीसीपी हैंडशेक को अपनी मशीन से 0/पर यातायात को कैप्चर और विश्लेषण करके पूरा करने के लिए पिन-पॉइंट कर सकते हैं। इसके साथ आपकी सहायता करने के लिए सबसे अच्छा टूल WireShark कहा जाता है। सौभाग्य।

TCP 3 way handshake

+0

मैं ऊपर मेरी कोड जोड़ लिया है के साथ एक ही सर्वर से कनेक्ट बनाता यू कर सकते हैं कृपया जाँच किसी भी संभावित त्रुटियों है है? उपरोक्त कोड मेरे नेटwrok में ठीक काम करता है, मेरे नेटवर्क गैर-ब्लॉक त्रुटि के कारण हो सकता है EINPROGRESS कभी नहीं – user1340512

+0

@ user1340512: कोड के स्वच्छ और पूर्ण संस्करण को पोस्ट करने का प्रयास करें ताकि कोई परीक्षण कर सके। – gsbabil

+0

आपके उत्तर के लिए धन्यवाद, मैं यहां सभी कोड पोस्ट नहीं कर सकता, लेकिन मैंने केवल उस कोड को चिपकाया जहां विफलता वापस आती है। कोड हमारे नेटवर्क में ठीक काम करता है (हो सकता है क्योंकि हमारे नेटवर्क में गैर-ब्लॉक त्रुटि कभी नहीं होती है और हमेशा सफल होती है)। मैं पता करने की जरूरत है, तो EINPROGRESS errno सेट कोड काम ठीक से ऊपर है या इससे पहले 60 s abvoe कोड लौट सकते हैं -1 – user1340512

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

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