ซ็อกเก็ต UDP พอร์ตที่ถูกผูกไว้เหมือนกันและรับข้อมูลทั้งหมด

ฉันต้องทำการทดสอบที่สำคัญ เงื่อนไขการทดสอบมีดังนี้

ฉันใช้ winsock และฉันมีซ็อกเก็ต UDP 2 ช่อง (Sock-A และ Sock-B) ซึ่งมีตัวเลือก SO_REUSEADDR ทั้งคู่เชื่อมโยงกับพอร์ต 1,000 บนพีซีเครื่องเดียว ทั้งสองส่งแพ็คเก็ต UDP ออกไปยังซ็อกเก็ตอื่น (Sock-C) และ Sock-C ซึ่งอยู่ใน LAN ที่แตกต่างกันจะได้รับข้อความของพวกเขา

Sock-C ตอบกลับด้วยข้อความบางส่วน แต่น่าเสียดายที่ฉันเห็นเพียง Sock-A (ซึ่งเปิดเร็วกว่านี้) เพิ่งได้รับข้อความ และ Sock-B ไม่ได้รับอะไรเลย เมื่อฉันปิด Sock-A ฉันจะเห็นว่า Sock-B เริ่มรับข้อความ

ท่านใดทราบบ้างว่าควรทำอย่างไรเพื่อให้ทั้ง Sock-A และ Sock-B สามารถรับข้อความจาก Sock-C ได้

ขอบคุณ~


person mehrdad fallahpour    schedule 19.04.2017    source แหล่งที่มา
comment
SO_REUSEADDR มีอยู่ใน WinSock หรือไม่ คุณกำลังตรวจสอบค่าส่งคืนจาก setsockopt หรือไม่? msdn.microsoft.com/en -us/library/windows/desktop/   -  person Neil    schedule 19.04.2017
comment
เหตุใดคุณจึงใช้พอร์ตเดียวกัน - xyproblem.info   -  person Karoly Horvath    schedule 19.04.2017
comment
ใช่ เป็นไปได้ที่จะผูกพอร์ตเดียวกันเข้ากับซ็อกเก็ตสองซ็อกเก็ตที่แตกต่างกันด้วยตัวเลือก SO_REUSEADDR   -  person mehrdad fallahpour    schedule 20.04.2017
comment
เหตุผลที่ฉันต้องใช้พอร์ตเดียวกันคือ ฉันมีซอฟต์แวร์ Voip ที่มีตัวฟัง UDP เพื่อรับแพ็กเก็ตเสียง แอปพลิเคชันนี้ปิดแล้ว และฉันไม่สามารถเปลี่ยนแปลงได้ ฉันต้องส่งแพ็กเก็ตเสียงไปยังซอฟต์แวร์นี้จากที่ไหนสักแห่งที่อยู่ด้านหลัง NAT อื่น ในการจัดการการเชื่อมต่อ P2P สำหรับเพียร์เหล่านั้น ฉันจำเป็นต้องผูกซ็อกเก็ต UDP เช่นเดียวกับซอฟต์แวร์ voip บนโฮสต์เดียวกัน และส่งแพ็กเก็ต UDP ไปยังต้นทางของแพ็กเก็ตเสียง จากนั้น NAT ที่ไม่มีการส่งต่อพอร์ตและ STUN/TURN และ ... จะกำหนดเส้นทางแพ็กเก็ตไปยังซอฟต์แวร์ Voip   -  person mehrdad fallahpour    schedule 20.04.2017
comment
ฉันขอโทษ แต่ฉันนึกไม่ออกว่าคุณกำลังพยายามทำอะไรกับคำอธิบายที่ให้ไว้   -  person rinn2883    schedule 21.04.2017


คำตอบ (1)


นี่เป็นพฤติกรรมปกติ ฉันคิดว่าไม่สามารถทำได้ด้วย 2 ซ็อกเก็ตที่ฟังบนพอร์ตเดียวกัน

เหตุใดคุณจึงรวม 2 ซ็อกเก็ตเข้ากับพอร์ตเดียวกัน

อ่าน ซ็อกเก็ต ตัวเลือก SO_REUSEADDR และ SO_REUSEPORT ต่างกันอย่างไร สิ่งเหล่านี้มีความหมายเหมือนกันในระบบปฏิบัติการหลักทั้งหมดหรือไม่

ใน linux มันจะพยายามกระจายดาตาแกรมเท่าๆ กันระหว่าง 2 ซ็อกเก็ต ดังนั้นจึงเป็นการสุ่ม คุณจะต้องเปลี่ยนวิธีการส่ง/รับแพ็กเก็ต

person rinn2883    schedule 19.04.2017
comment
เมื่อซ็อกเก็ต UDP สองซ็อกเก็ตถูกผูกเข้ากับพอร์ตเดียวกัน และได้รับแพ็กเก็ตยูนิคาสต์ขาเข้าบนพอร์ตนั้น ซ็อกเก็ตนั้นจะถูกส่งไปยังหนึ่งในสองซ็อกเก็ต (เลือกโดยพลการ) หากแพ็กเก็ตขาเข้าเป็นแพ็กเก็ต UDP แบบหลายผู้รับ OTOH มันจะถูกส่งไปยังทุกซ็อกเก็ตที่เชื่อมโยงกับพอร์ต (พฤติกรรมหลังเป็นสิ่งจำเป็นเพื่อให้หลายโปรแกรมบนโฮสต์เดียวกันสามารถฟังกลุ่มมัลติคาสต์เดียวกันพร้อมกัน) - person Jeremy Friesner; 19.04.2017
comment
จุดดี. ฉันไม่ได้รวมไว้เพราะ op ไม่ได้พูดถึงการใช้มัลติคาสต์ - person rinn2883; 19.04.2017
comment
ขอบคุณเพื่อนๆ แล้วฉันจะจัดการกับปัญหานี้ได้อย่างไร? เนื่องจากฉันกำลังส่งแพ็กเก็ตผ่านอินเทอร์เน็ต ฉันสามารถส่งแพ็กเก็ตเหล่านั้นในโหมดมัลติคาสต์ได้หรือไม่ - person mehrdad fallahpour; 20.04.2017
comment
ขึ้นอยู่กับว่าซอฟต์แวร์ VoIP ปิดอยู่ จะต้องรองรับการฟังที่อยู่แบบหลายผู้รับ ในการส่งคุณไม่จำเป็นต้องเข้าร่วมกลุ่มมัลติคาสต์ แต่ในการรับจะต้องเข้าร่วมกลุ่ม - person rinn2883; 21.04.2017