Java Serversocket.accept() ไม่ส่งคืนซ็อกเก็ตตามลำดับการเชื่อมต่อจากไคลเอนต์

เราสร้างการเชื่อมต่อ 2 รายการระหว่างเซิร์ฟเวอร์ Java และไคลเอนต์ C++ การเรียกวัตถุ Java ServerSocket ยอมรับ () สองครั้งและแต่ละส่งคืน 1 ซ็อกเก็ต การเรียกไคลเอ็นต์ C ++ เชื่อมต่อ () สองครั้ง เราถือว่าพอร์ตของซ็อกเก็ตที่ 1 ที่ส่งคืนโดยยอมรับ () ควรเหมือนกับพอร์ตของซ็อกเก็ตไคลเอนต์แรกที่เรียกเชื่อมต่อ () และเหมือนกันสำหรับซ็อกเก็ตคู่ที่ 2

แต่จากการตรวจสอบหมายเลขพอร์ตในแต่ละซ็อกเก็ต ฉันได้เห็นกรณีที่ผิดปกติเป็นครั้งคราว โดยที่ซ็อกเก็ตที่ 1 จาก Accept() เชื่อมต่อกับซ็อกเก็ตไคลเอนต์ที่ 2 ที่เรียกเชื่อมต่อ () และซ็อกเก็ตที่ 2 จาก Accept() เชื่อมต่อกับซ็อกเก็ตไคลเอนต์ที่ 1 .

ทั้งเซิร์ฟเวอร์และไคลเอนต์เป็นแบบเธรดเดียวที่นี่เพื่อสร้างการเชื่อมต่อ ลำดับจะย้อนกลับได้อย่างไร?


person Kevin    schedule 26.06.2014    source แหล่งที่มา


คำตอบ (2)


ลำดับของแพ็กเก็ตการซิงโครไนซ์เริ่มต้นจากการเชื่อมต่อทั้งสองอาจถูกสลับบนเครือข่าย ตัวอย่างเช่น หากแพ็กเก็ต SYN เริ่มต้นของการเชื่อมต่อ "แรก" หลุด และแพ็กเก็ตนั้นจะไม่ถูกส่งอีกครั้งจนกว่าจะหลังจากแพ็กเก็ต SYN เริ่มต้นของการเชื่อมต่อ "ที่สอง" นอกจากนี้ แม้ว่าเซิร์ฟเวอร์และไคลเอ็นต์ของคุณเป็นแบบเธรดเดียว รหัสระบบที่จัดการสแต็ก TCP อาจเป็นแบบมัลติเธรด

person Warren Dew    schedule 26.06.2014
comment
ฉันคิดว่าการจับมือกันเสร็จสิ้นก่อนที่จะเชื่อมต่อ () กลับ ดังนั้นการจัดการ SYN ที่หลุดและการส่งซ้ำควรเสร็จสิ้นก่อนที่จะเชื่อมต่อ () กลับ - person Kevin; 28.06.2014

คุณไม่รู้ว่า 'ลำดับการเชื่อมต่อจากไคลเอนต์' คืออะไร การเชื่อมต่อเป็นการจับมือแบบสามทางพร้อมการลองแพ็กเก็ตอีกครั้ง ลำดับในคิวที่ค้างอยู่จะเป็นลำดับการรับ ACK สุดท้าย ซึ่งคุณไม่มีความรู้ใดๆ

person user207421    schedule 27.06.2014
comment
ACK สุดท้ายหลังจากเชื่อมต่อ () สามารถกลับมาได้หรือไม่ ถ้าไม่เช่นนั้น ลำดับของ ACK สุดท้ายควรจะเหมือนกับลำดับของการเชื่อมต่อ () - person Kevin; 28.06.2014
comment
ACK สุดท้ายจะถูกส่งจากไคลเอนต์ไปยังเซิร์ฟเวอร์ ลูกค้าไม่รู้ด้วยซ้ำว่าได้รับเมื่อไร - person Warren Dew; 28.06.2014