घर
Top.Mail.Ru Yandeks.Metrika
फोरम: "नेटवर्क";
वर्तमान संग्रह: 2002.04.01;
डाउनलोड करें: [xml.tar.bz2];

नीचे

सॉकेट्स के साथ काम करें इसी तरह की शाखाएँ खोजें


Valdemar   (2002-01-17 14:37) [0]

मैं एक सॉकेट के साथ सिंक्रोनस मोड में काम करता हूं। मैं यह कैसे निर्धारित करूं कि आने वाली स्ट्रीम में अपठित डेटा है। अगर आप कोशिश कर सकते हैं।
अग्रिम धन्यवाद।



Digitman   (2002-01-17 14:41) [1]

तुल्यकालिक मोड में, कुछ भी परिभाषित करने की आवश्यकता नहीं है। इस मोड में, ऑनरेड ईवेंट ठीक उसी समय होता है जब इनपुट स्ट्रीम में पढ़ने के लिए डेटा उपलब्ध होता है।



Valdemar   (2002-01-17 16:16) [2]

फिर कोड का एक टुकड़ा काम क्यों नहीं करता है?

प्रक्रिया TForm1.ServerSocket1ClientRead (प्रेषक: TObject;
गर्तिका: TCustomWinSocket);
था
tr: trec;
शुरू करना
Application.ProcessMessages;
सॉकेट। ReceiveBuf (tr, sizeof (tr));
// प्रसंस्करण

अंत;



Digitman   (2002-01-17 17:25) [3]

1। क्यों - Application.ProcessMessages?
2। इसका क्या मतलब है - "काम नहीं कर रहा है"?



Valdemar   (2002-01-17 18:03) [4]

Application.ProcessMessages ताकि डेटा का इंतजार करने पर एप्लिकेशन फ्रीज न हो
और काम नहीं करता है क्योंकि यह यहां नहीं मिलता है



Digitman   (2002-01-17 18:15) [5]

और क्यों आवेदन कुछ "लटका" करना चाहिए? क्या यह किसी तरह का लंबा चक्र है जो आपके पास ऑनक्लीयर रीड हैंडलर में है? बफर पढ़ने से पहले आपके पास कोई चक्र नहीं है, जहां तक ​​यह आपके टुकड़े से स्पष्ट है।

"नहीं मिल रहा है" का अर्थ है या तो क्लाइंट कुछ भी संचारित नहीं करता है, या सर्वर निष्क्रिय है, या यह थ्रेडब्लॉकिंग है, या ... आपको कभी नहीं पता कि अन्य कारण क्या हैं!

क्या आप सुनिश्चित हैं कि "क्लाइंट" सर्वर से सफलतापूर्वक जुड़ा हुआ है? किस आधार पर सुनिश्चित करें? इवेंट OmClientCoinnect होने के लिए? यदि - हुआ, तो OnClientRead घटना भी होनी चाहिए। और अगर यह नहीं है, तो या तो कनेक्शन पहले से ही टूट गया है, या "क्लाइंट" कुछ भी नहीं भेजता है या इसे गलत तरीके से भेजता है, या ... फिर से, आप कभी नहीं जानते कि क्या!



Valdemar   (2002-01-17 19:03) [6]

तथ्य यह है कि सर्वर onThreadBlocking है



Valdemar   (2002-01-17 22:20) [7]

मुझे यकीन है कि क्लाइंट सही तरीके से कनेक्ट होता है, क्योंकि जब onAccept होता है, तो मैं डेटा को सामान्य रूप से पढ़ता हूं, लेकिन मैं डेटा के अगले हिस्से को नहीं पढ़ सकता।



Digitman   (2002-01-18 08:54) [8]

थ्रेडब्लॉकिंग, आप कहते हैं?
तब मैं पर्याप्त आत्मविश्वास शेयर के साथ मान सकता हूं कि आपने TServerClientThread वर्ग को ओवरराइड करने के बारे में नहीं सोचा था। और मैंने उनके ग्राहक सेवा पद्धति के कार्यान्वयन को भी नहीं देखा। है ना? फिर यहाँ देखें, मैं आपके लिए थ्रेडिंग सर्वर पर क्लाइंट कनेक्शन के ट्रांसपोर्ट स्ट्रीम में क्या हो रहा है, इसका विश्लेषण करने का काम करूंगा:

प्रक्रिया TServerClientThread.ClientExecute; वर FDSet: TFDSet; TimeVal: TTimeVal; शुरू करना // यातायात प्रवाह के पूरा होने के बारे में कोई संकेत नहीं है और परिवहन सक्रिय है जबकि समाप्त नहीं किया गया और clientsocket.connected करते हैं शुरू करना FD_ZERO (FDSet); FD_SET (ClientSocket.SocketHandle, FDSet); TimeVal.tv_sec: = 0; TimeVal.tv_usec: = 500; // सॉकेट के साथ जुड़े WSAEvent इवेंट ऑब्जेक्ट की स्थिति की जांच करते हुए, आधे सेकंड तक प्रतीक्षा करें अगर (चयन (0, @FDSet, nil, nil, @TimeVal)> 0) और तब समाप्त नहीं हुआ // अगर WSAEvent ईवेंट ऑब्जेक्ट सिग्नल की स्थिति में है (अधिक सटीक रूप से, यह FD_READ ईवेंट को इंगित करता है) और थ्रेड को अभी तक समाप्त होने की आवश्यकता के बारे में बाहर से सूचित नहीं किया गया है, तो: अगर ClientSocket.ReceiveBuf (FDSet, -1) = 0 तो // यदि सॉकेट का रीड बफर खाली है तोड़ // चक्र से बाहर निकलें, परिवहन के पूरा होने, ग्राहक कनेक्शन टूट जाएगा - ग्राहक से अधिक डेटा नहीं अन्यथा सिंक्रनाइज़ (DoRead); // मुख्य प्रवाह में OnClientRead घटना आरंभ करें जहां बफर को पढ़ा जा सकता है (पूरे या आंशिक रूप से) अगर (चयन (0, nil, @FDSet, nil, @TimeVal)> 0) और तब समाप्त नहीं हुआ सिंक्रनाइज़ (DoWrite); // ग्राहक को डेटा स्थानांतरित करने के लिए सॉकेट की तत्परता के बारे में सूचित करने के लिए एक बार OnClientWrite घटना शुरू करें अंत; अंत;



Digitman   (2002-01-18 09:00) [9]

इस प्रकार, OnAccept () घटना में, आपने सॉकेट के रीड बफर को स्कूप किया, बफर खाली है (क्लाइंट ने अब संचारित नहीं किया है) और ट्रांसपोर्ट डिस्कनेक्ट की गई स्थिति में चला जाता है (क्लाइंट बस सर्वर द्वारा बंद कर दिया जाता है), और ट्रांसपोर्ट स्ट्रीम या तो समाप्त हो जाती है या डिस्पैचर द्वारा मुफ्त पूल में लौट जाती है KeepInCache = True) के साथ



पन्ने: 1 पूरी शाखा

फोरम: "नेटवर्क";
वर्तमान संग्रह: 2002.04.01;
डाउनलोड करें: [xml.tar.bz2];

ऊपर









मेमोरी: 0.59 एमबी
समय: 0.03 c
3-1
volodya_
2002-03-05 09:17
2002.04.01
प्रत्येक पृष्ठ के मानों की संख्या की गणना करने के लिए Qreport में कैसे?


3-50
AndrewK
2002-03-05 15:35
2002.04.01
SQL क्वेरी कैसे बनाएं


7-326
Linx
2001-12-21 01:09
2002.04.01
वर्चुअल प्रिंटर


1-125
Yulik
2002-03-21 13:13
2002.04.01
तार के साथ काम करना


14-294
Fellomena
2002-02-13 15:53
2002.04.01
मुझे अपनी प्रार्थनाओं में याद रखें - निकट भविष्य में मुझे फोरट्रान = (





अफ्रीकी अल्बानियन अरबी भाषा अर्मेनियाई आज़रबाइजानी बस्क बेलारूसी बल्गेरियाई कैटलन सरलीकृत चीनी) चीनी पारंपरिक) क्रोएशियाई चेक डेनिश डच अंग्रेज़ी एस्तोनियावासी फिलिपिनो फिनिश फ्रेंच
गैलिशियन् जॉर्जियाई जर्मन यूनानी हाईटियन यहूदी हिंदी हंगरी आइसलैंड का इन्डोनेशियाई आयरिश इतालवी जापानी कोरियाई लात्वीयावासी लिथुआनियाई मेसीडोनियन मलायी मोलतिज़ नार्वेजियन
फ़ारसी पोलिश पुर्तगाली रोमानियाई रूसी सर्बियाई स्लोवाक स्लोवेनियाई स्पेनिश स्वाहिली स्वीडिश थाई तुर्की यूक्रेनी उर्दू वियतनामी वेल्श यहूदी बंगाली बोस्नियाई
सिबुआनो एस्पेरांतो गुजराती हौसा हमोंग ईग्बो जावानीस कन्नड़ खमेर लाओ लैटिन माओरी मराठी मंगोलियन नेपाली पंजाबी सोमाली तामिल तेलुगु योरूबा
ज़ुलु
Английский Французский Немецкий Итальянский Португальский Русский Испанский