Socket.EndRead 0 ไบต์หมายถึงตัดการเชื่อมต่อหรือไม่

ฉันสงสัยว่าใน Async Sockets ของฉันใน c # การได้รับ 0 ไบต์ในการเรียก EndRead หมายความว่าเซิร์ฟเวอร์ตัดการเชื่อมต่อของเราจริง ๆ หรือไม่

ตัวอย่างมากมายที่ฉันเห็นแนะนำว่าเป็นกรณีนี้ แต่ฉันได้รับการตัดการเชื่อมต่อบ่อยกว่าที่ฉันคาดไว้มาก

รหัสนี้ถูกต้องหรือไม่? หรือ endResult ‹= 0 ไม่ได้มีความหมายอะไรเกี่ยวกับสถานะการเชื่อมต่อจริงๆ หรือ

private void socket_EndRead(IAsyncResult asyncResult)
{ 
  //Get the socket from the result state
  Socket socket = asyncResult.AsyncState as Socket;

  //End the read
  int endResult = Socket.EndRead(asyncResult);

  if (endResult > 0)
  {
    //Do something with the data here


  }
  else
  {
    //Server closed connection?  
  }
}

person Redth    schedule 08.09.2009    source แหล่งที่มา
comment
ฉันเดาว่าฉันไม่ควรละเลยที่จะแบ่งปันว่าจริง ๆ แล้วฉันกำลังใช้ SslStream แต่ฉันไม่คิดว่ามันเกี่ยวข้องมากนักในตอนแรก เนื่องจากฉันแน่ใจว่ากระแสข้อมูลพื้นฐานนั้นเดือดลงไปที่ซ็อกเก็ตอยู่ดี อย่างไรก็ตาม เนื่องจากฉันใช้ SslStream ฉันจึงไม่มีสิทธิ์เข้าถึงเพื่อตรวจสอบสถานะการเชื่อมต่อของซ็อกเก็ต บางทีฉันควรจะตรวจสอบ SslStream.CanRead ทุกครั้งที่ได้รับ 0 ไบต์จาก EndRead   -  person Redth    schedule 08.09.2009


คำตอบ (2)


ความยาวการอ่าน 0 ควรหมายถึงการปิดระบบอย่างสง่างาม ยกเลิกการเชื่อมต่อ ข้อผิดพลาด (10054, 10053 หรือ 10051)

ในทางปฏิบัติแม้ว่าฉันจะสังเกตเห็นว่าการอ่านเสร็จสมบูรณ์ด้วยความยาว 0 แม้ว่าการเชื่อมต่อจะยังคงอยู่ และวิธีเดียวที่จะจัดการคือตรวจสอบสถานะซ็อกเก็ตในการอ่านความยาว 0 สถานการณ์เป็นดังนี้: โพสต์บัฟเฟอร์หลายตัวบนซ็อกเก็ตเพื่อรับ กระทู้ที่โพสต์นั้นถูกตัดแต่งโดยพูล ระบบปฏิบัติการสังเกตเห็นว่าเธรดที่สร้างคำขอหายไป และแจ้งเตือนการดำเนินการที่โพสต์ด้วยข้อผิดพลาด 995 ERROR_OPERATION_ABORTED ตามที่บันทึกไว้ อย่างไรก็ตาม สิ่งที่ฉันพบคือเมื่อมีการโพสต์การดำเนินการหลายรายการ (เช่น การอ่านหลายรายการ) เฉพาะ ครั้งแรก เท่านั้นที่จะได้รับแจ้งด้วยข้อผิดพลาด 995 ส่วนการดำเนินการถัดไปจะได้รับแจ้งด้วยความสำเร็จและความยาว 0

person Remus Rusanu    schedule 08.09.2009
comment
ฉันเพิ่มความคิดเห็นในคำถามของฉัน... ดังนั้น การใช้ SslStream.CanRead ทุกครั้งที่ฉันได้รับ EndRead ความยาว 0 คุณคิดว่าเพียงพอหรือไม่ - person Redth; 08.09.2009
comment
หากคุณมีสตรีมที่เข้ารหัสที่ ด้านบน ของสตรีมเครือข่าย คิดว่าแตกต่างกันมาก อันดับแรก คุณไม่สามารถมีสถานการณ์ที่ฉันอธิบายได้ เนื่องจาก SslStream จะไม่ยอมรับการอ่านที่โพสต์หลายครั้ง ประการที่สอง แม้ว่า หาก ซ็อกเก็ตส่งคืนความสำเร็จโดยมีข้อผิดพลาด 0 ก็ตาม SslStream ก็ได้เห็นสิ่งนี้แล้วและดำเนินการตามนั้น (เช่น สถานะ Ssl ของคุณจะอนุญาตให้คุณดำเนินการต่อได้) ดังนั้นคุณจึงมีการดำเนินการที่เป็นไปได้เพียงวิธีเดียวเท่านั้น เพื่อกำจัดกระแสและเชื่อมต่ออีกครั้ง - person Remus Rusanu; 08.09.2009
comment
พิมพ์ผิดมากมาย: thinks=›things, will nowallow=› จะ ไม่ อนุญาต - person Remus Rusanu; 08.09.2009
comment
สรุปแล้ว หากฉันได้รับ int lengthRead = sslStream.EndRead(state) กลับเป็น 0 ฉันคงต้องดูดมันและเชื่อมต่อใหม่ไม่ว่าจะเกิดอะไรขึ้น - person Redth; 08.09.2009
comment
ฉันสงสัยเช่นนั้น แต่ฉันไม่เคยลองใช้สิ่งนี้กับสตรีมที่เข้ารหัส ดังนั้นมันจึงคุ้มค่าที่คุณจะได้ลองดู บางที CanRead อาจใช้งานได้... ฉันก็แปลกใจเหมือนกัน - person Remus Rusanu; 08.09.2009
comment
จะเกิดอะไรขึ้นถ้าฉันเริ่มการอ่านคำขอใดที่จะอ่าน 0 ไบต์? จะตรวจสอบการเชื่อมต่อปิดได้อย่างไรหากฉันขออ่าน 0 ไบต์? - person Benny; 26.05.2014
comment
@เบนนี่: ถ้าคุณยิงตัวเองเข้าที่เท้า คุณจะเจ็บ (เมื่อสำเร็จ) ทำไมต้องขอให้อ่านความยาว 0? ขอให้อ่านที่ถูกต้องและคุณจะไม่มีปัญหานี้ - person Remus Rusanu; 26.05.2014

จากเอกสาร:

หากโฮสต์ระยะไกลปิดการเชื่อมต่อซ็อกเก็ตและได้รับข้อมูลที่มีอยู่ทั้งหมด วิธีการ EndRead จะดำเนินการทันทีและส่งกลับไบต์เป็นศูนย์

ใช่แล้ว ศูนย์ไบต์หมายถึงการปิดระยะไกล

person Mark Rushakoff    schedule 08.09.2009
comment
วิธีที่ MSDN พูดนั้นไม่ได้บอกเป็นนัยอย่างชัดเจนว่าหากได้รับ 0 ไบต์ การเชื่อมต่อจะต้องถูกปิด เพียงแต่ว่าหากการเชื่อมต่อถูกปิด จะได้รับ 0 ไบต์ บางทีฉันอาจอ่านตรรกะของข้อความนี้มากเกินไป... - person Redth; 08.09.2009
comment
เป็นการปิดกั้นการอ่านครับ ซึ่งหมายความว่าจะรอ ตลอดไป จนกว่าจะมีไบต์อย่างน้อยหนึ่งไบต์เข้ามา หากคุณเห็นไบต์เป็นศูนย์ สถานการณ์เดียวที่เป็นไปได้ก็คือโฮสต์ระยะไกลปิดซ็อกเก็ต - person Mark Rushakoff; 08.09.2009
comment
จะเกิดอะไรขึ้นถ้าฉันเริ่มการอ่านคำขอใดที่จะอ่าน 0 ไบต์? จะตรวจสอบการเชื่อมต่อปิดได้อย่างไรหากฉันขออ่าน 0 ไบต์? - person Benny; 26.05.2014