recv वापस आ जाएगी आंतरिक बफ़र्स में डेटा लौटाने के लिए नहीं है जब। यदि आप 100 बाइट्स का अनुरोध करते हैं तो यह 100 बाइट्स तक इंतजार नहीं करेगा।
यदि आप 100 बाइट "संदेश" भेज रहे हैं, तो याद रखें कि टीसीपी संदेश प्रदान नहीं करता है, यह सिर्फ एक स्ट्रीम है। यदि आप एप्लिकेशन संदेशों से निपट रहे हैं, तो आपको इसे एप्लिकेशन लेयर पर संभालना होगा क्योंकि टीसीपी ऐसा नहीं करेगा।
ऐसी कई स्थितियां हैं जहां 100 बाइट्स की एक प्रेषण() कॉल दूसरे छोर पर पूरी तरह से पढ़ी नहीं जा सकती है, जबकि रिकव (..., 100) कॉल करते समय केवल एक रिकव कॉल के साथ; यहां सिर्फ एक कुछ उदाहरण है:
भेजने टीसीपी ढेर एक साथ 15 लिखने कॉल बंडल करने का फैसला किया, और MTU 1460 जो हुआ - पहुंचे डेटा के समय के आधार पर ग्राहकों को पहले 14 कारण हो सकता है 100 बाइट्स लाने के लिए कॉल और 15. 60 बाइट्स लाने के लिए कॉल - अगली बार बाइट अगली बार जब आप recv() को कॉल करेंगे।(लेकिन यदि आप 100 के बफर के साथ आरईवी को कॉल करते हैं, तो आपको पहले संदेश के पहले 40 बाइट और अगले संदेश के पहले 60 बाइट मिल सकते हैं)
प्रेषक बफर पूर्ण हैं, शायद पाठक धीमा है, या नेटवर्क भीड़ है। कुछ बिंदु पर, डेटा बफर खाली करने के दौरान हो सकता है और डेटा का अंतिम हिस्सा 100 का एक से अधिक हिस्सा नहीं था।
रिसीवर बफर पूर्ण हैं, जबकि आपका ऐप recv() वह डेटा, आखिरी खंड खींचता है केवल आंशिक है क्योंकि उस संदेश के पूरे 100 बाइट बफर फिट नहीं थे। आप से बढ़ाना के रूप में और गति नीचे जिस पर संदेश भेजे जाते हैं चीजों में अंतर हो सकता -
इन परिदृश्यों में से कई नहीं बल्कि परीक्षण करने के लिए, विशेष रूप से एक लैन पर आप भीड़ या पैकेट क्षति के एक बहुत कुछ नहीं हो सकता है, जहां मुश्किल है/उत्पादन किया।
वैसे भी। यदि आप एक सॉकेट से 100 बाइट्स पढ़ने के लिए चाहते हैं,
int
readn(int f, void *av, int n)
{
char *a;
int m, t;
a = av;
t = 0;
while(t < n){
m = read(f, a+t, n-t);
if(m <= 0){
if(t == 0)
return m;
break;
}
t += m;
}
return t;
}
की तरह कुछ का उपयोग करें ...
if(readn(mysocket,buffer,BUFFER_SZ) != BUFFER_SZ) {
//something really bad is going on.
}
विस्तृत स्पष्टीकरण के लिए धन्यवाद। बस पुष्टि कर रहा है कि यह * अवरुद्ध * recv() कॉल के लिए भी सही है या नहीं? (यानी recv() अनुरोध बाइट्स से कम के साथ वापसी) – Adil
हां, यह एक अवरुद्ध आरईवी कॉल के लिए सच है। – nos