2012-10-24 6 views
7

मैं एक टीसीपी/आईपी अनुप्रयोग के लिए TTCPBlockSocket का उपयोग कर रहा हूं। समस्या यह है कि मैं यह निर्धारित नहीं कर सकता कि कनेक्शन कब खो गया है।डेल्फी + Synapse: यह जांचने के लिए कि क्या मैं अभी भी कनेक्ट हूं

GetLastError रिटर्न 0
Read रिटर्न 0

लेकिन अगर आवेदन से जुड़ा हुआ है इसलिए मैं इसे प्राप्त कर सकते हैं जब टीसीपी/आईपी कनेक्शन खो जाता है मैं कैसे अधिसूचित किया जा सकता मैं ये मान eaven मुठभेड़।

धन्यवाद

+0

मैं कहूंगा ['CanRead'] (http://synapse.ararat.cz/doc/help/blcksock.TBlockSocket.html#CanRead) फ़ंक्शन कॉल पासिंग 0 को 'टाइमआउट' पैरामीटर के रूप में है जो आप हैं खोज रहे हैं यह फ़ंक्शन आंतरिक रूप से 'InternalCanRead' को कॉल करता है जो विंसॉक ['select'] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms740141 (v = vs.85) .aspx) फ़ंक्शन करता है। यदि कोई त्रुटि होती है तो 'CanRead' फ़ंक्शन गलत होता है। – TLama

+1

@TLama मैं उस धन्यवाद का प्रयास करूंगा। – opc0de

+0

@TLama आपके उत्तर ने मुझे सही रास्ते पर ले जाया है, निम्न शर्त को यह जांचने के लिए पूरा किया जाना चाहिए कि यह TCPBlockSocket.CanRead (0) और TCPBlockSocket.WaitingData = 0 डिस्कनेक्ट किया गया है: = सत्य। – opc0de

उत्तर

1

मैं कहूंगा, आप CanRead विधि का उपयोग कर सकते हैं, अपने Timeout पैरामीटर के लिए 0 से गुजर रहा। यह फ़ंक्शन सॉकेट के लिए आंतरिक रूप से select फ़ंक्शन करता है और त्रुटि होने पर गलत होता है। यदि आप कनेक्शन खो देते हैं तो select फ़ंक्शन SOCKET_ERROR के बाद से इस विधि का उपयोग करने के लिए पर्याप्त होना चाहिए, और परिणामस्वरूप CanRead विधि वापसी गलत होती है। तो मुझे लगता है, इसलिए यह देखना काफी है अगर गर्तिका कनेक्शन इस तरह से जीवित है: अगर ग्राहक अभी भी जुड़ा हुआ है तुम दोनों की जाँच करने के TCPBlockSocket.CanRead (0) और TCPBlockSocket जरूरत

function IsSocketAlive(ASocket: TTCPBlockSocket): Boolean; 
begin 
    Result := ASocket.CanRead(0); 
end; 
+0

नोप इस – opc0de

+0

के लिए स्वयं को +1 करने के लिए पर्याप्त परीक्षण नहीं है 'वेटिंगडाटा' विधि (जैसा कि आपने जोड़ा है) नेटवर्क के इनपुट बफर में लंबित डेटा की मात्रा लौटाता है, और यदि वह आंतरिक 'ioctlsocket' फ़ंक्शन कॉल विफल नहीं होता है 'SOCKET_ERROR' और उस समय लंबित डेटा राशि लौटाता है जब आपका कनेक्शन पहले ही खो जाता है, तो यह आपकी आवश्यकताओं को प्रतिबिंबित नहीं करता है। या मैं गलत हूँ ? (दुर्भाग्यवश, मैं अब इसका परीक्षण नहीं कर सकता) – TLama

1

opC0de कहते हैं, जांच करने के लिए। WaitingData = 0

function IsSocketAlive(ASocket: TTCPBlockSocket): Boolean; 
begin 
    Result := (ASocket.Socket = INVALID_SOCKET) or ((ASocket.WaitingData = 0) and ASocket.CanRead(0)); 
end; 

मैं अपनी परियोजनाओं में इस तरह से उपयोग कर रहा हूं इसलिए मैं पुष्टि कर सकता हूं कि यह काम करता है।

+0

यदि आप नेटवर्क केबल को अनप्लग करते हैं तो यह अपेक्षा के अनुसार काम करता है? – mjn

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