سؤال

ولقد قرأت مثالا على TCP خادم صدى وبعض الأشياء غير واضحة بالنسبة لي.

TcpClient client = null;
NetworkStream netStream = null;

try {
  client = listener.AcceptTcpClient(); 
  netStream = client.GetStream();

  int totalBytesEchoed = 0;
  while ((bytesRcvd = netStream.Read(rcvBuffer, 0, rcvBuffer.Length)) > 0) {
    netStream.Write(rcvBuffer, 0, bytesRcvd);
    totalBytesEchoed += bytesRcvd;
  }

  netStream.Close();
  client.Close();
} catch {
  netStream.Close();
}

وعندما يستلم الملقم حزمة (حلقة في حين)، وقال انه يقرأ البيانات إلى rcvBuffer ويكتب عليه إلى الدفق.

ما يخلط لي هو الترتيب الزمني من الرسائل في الاتصال. هي البيانات التي كانت مكتوبة مع netStream.Write () أرسلت على الفور إلى العميل (الذي قد يكون لا يزال حتى يرسل)، أو فقط بعد البيانات التي سبق كتابي إلى تيار (قبل العميل) المصنعة.

والسؤال التالي يمكن حتى توضيح سابقة: إذا يرسل العميل بعض البيانات عن طريق الكتابة إلى تيار، هو أن بيانات انتقلت إلى قائمة انتظار الرسائل على الخادم الجانب في انتظار أن تقرأ ذلك التيار هو في الواقع "فارغة"؟ وهذا يفسر لماذا الخادم يمكن أن يكتب مباشرة إلى تيار - لأن البيانات التي تأتي من تيار يتم تخزينها مؤقتا في الواقع في أي مكان آخر ...

هل كانت مفيدة؟

المحلول

وتلميح: طريقة الاتصال NetworkStream.Read يتم حظر في هذا المثال

وهذا الكتاب هو الصحيح تماما - وصول الخام إلى TCP تيارات لا يعني أي نوع من خارج "تجزئة معلومات"، وفي هذا المثال على سبيل المثال، يمكن بسهولة معالجتها بايت واحد في وقت واحد. ومع ذلك، وأداء القراءة والكتابة على دفعات (عادة مع مخازن يتعرض) يمكن أن تسمح لمعالجة أكثر كفاءة (في كثير من الأحيان نتيجة للاستدعاءات النظام أقل). كما تستخدم الأجهزة طبقة الشبكة والشبكة هناك أشكال الخاصة من المخازن المؤقتة.

وهناك في الواقع ما يضمن أن البيانات المكتوبة من كتابة () والواقع أن يكتب قبل يقرأ أكثر () الكامل بنجاح: حتى إذا تم مسح البيانات في طبقة واحدة فإنه لا يعني يتم مسح في آخر، وهناك على الإطلاق أي ضمانة التي جعلت بيانات طريقها إلى أكثر إلى العميل. هذا هو المكان الذي تأتي بروتوكولات عالية المستوى في اللعب.

ومع هذا المثال صدى ويشق البيانات ببساطة من خلال بأسرع ما يمكن. كل من الكتابة والقراءة وكتلة يستند على كومة شبكة الأساسي (إرسال واستقبال مخازن على وجه الخصوص)، ولكل منها سلسلة الخاصة بهم من المخازن المؤقتة.

[هذا يبسط الأمور قليلا بالطبع - واحدة يمكن أن ننظر دائما في TCP [بروتوكول] نفسها التي لا تفرض خصائص الإرسال على تدفق حزم الفعلي]

نصائح أخرى

واتصال TCP هو، من حيث المبدأ، الازدواج الكامل. لذلك كنت تتعامل مع 2 قنوات منفصلة ونعم، كلا الجانبين يمكن الكتابة في نفس الوقت.

وأنت على حق أن الناحية الفنية عند تنفيذ قراءة () عملية، لم تكن قراءة البتات من السلك. كنت في الأساس قراءة البيانات مخزنة (قطع من قبل TCP الواردة ومرتبة في الترتيب الصحيح). عند إرسال يمكنك فلوش () التي ينبغي من الناحية النظرية أن ترسل البيانات على الفور، ولكن أكوام TCP الحديثة لديها قليلا من المنطق كيفية جمع البيانات في حزم حجم المناسبة وتفجيرها على السلك.

وكما هو موضح هينك HOLTERMAN، TCP هو بروتوكول الازدواج الكامل (إذا كان معتمدا من قبل جميع البنى التحتية الأساسية)، لذلك إرسال واستقبال البيانات من أكثر من عندما يقرأ لك الخادم / العميل ويكتب البيانات. انها ليست مثل عند الخادم إرسال البيانات، سوف عميل قراءتها على الفور. يمكن للعميل أن يرسل انها البيانات الخاصة ثم قم بإجراء قراءة ()، في هذه البيانات الحالة سوف تبقى في المخزن الشبكة لفترة أطول ويمكن التخلص منها بعد بعض الوقت أنه لا أحد يريد أن يقرأها. على الأقل لقد شهدت هذه عند التعامل مع مكتبة الخادم / العميل سوبا dupa بلدي (-.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top