Soket UDP port terikat identik dan menerima data pada semuanya

Saya perlu melakukan tes penting. Kondisi tesnya seperti di bawah ini.

Saya menggunakan winock dan saya memiliki 2 soket UDP (Sock-A dan Sock-B) yang dengan opsi SO_REUSEADDR keduanya telah terikat ke port 1000 pada satu PC. Keduanya mengirimkan paket UDP ke soket lain (Sock-C) dan Sock-C yang terletak di LAN berbeda menerima pesannya.

Sock-C membalasnya dengan beberapa pesan, tapi sayangnya saya hanya melihat Sock-A (yang dibuka lebih awal) hanya menerima pesan, dan Sock-B tidak mendapatkan apa-apa. Ketika saya menutup Sock-A saya dapat melihat bahwa Sock-B mulai menerima pesan.

Adakah di antara Anda yang tahu apa yang harus saya lakukan agar Sock-A dan Sock-B dapat menerima pesan dari Sock-C?

Terima kasih~


person mehrdad fallahpour    schedule 19.04.2017    source sumber
comment
Apakah SO_REUSEADDR tersedia di WinSock? Apakah Anda memeriksa nilai pengembalian dari setockopt? msdn.microsoft.com/en -us/library/windows/desktop/   -  person Neil    schedule 19.04.2017
comment
Mengapa Anda menggunakan port yang sama - xyproblem.info ?   -  person Karoly Horvath    schedule 19.04.2017
comment
Ya, dimungkinkan untuk mengikat port yang sama ke dua soket berbeda dengan opsi SO_REUSEADDR.   -  person mehrdad fallahpour    schedule 20.04.2017
comment
Alasan mengapa saya perlu menggunakan port yang sama adalah, saya memiliki perangkat lunak Voip yang memiliki pendengar UDP untuk menerima paket audio. Aplikasi ini ditutup dan saya tidak dapat mengubahnya. Saya perlu mengirim paket audio ke perangkat lunak ini dari suatu tempat di belakang NAT yang berbeda. Untuk menangani koneksi P2P untuk rekan-rekan tersebut, saya perlu mengikat soket UDP yang sama dengan perangkat lunak voip pada host yang sama dan mengirim paket UDP ke asal paket audio. Kemudian NAT tanpa port-forwarding dan STUN/TURN dan ... akan merutekan paket ke perangkat lunak Voip.   -  person mehrdad fallahpour    schedule 20.04.2017
comment
Maaf, tapi saya tidak bisa membayangkan apa yang Anda coba lakukan dengan penjelasan yang diberikan   -  person rinn2883    schedule 21.04.2017


Jawaban (1)


Ini adalah perilaku normal. Saya rasa ini tidak dapat dilakukan dengan 2 soket yang mendengarkan pada port yang sama.

Mengapa Anda mengikat 2 soket ke port yang sama?

Baca Soket pilihan SO_REUSEADDR dan SO_REUSEPORT, apa bedanya? Apakah maksudnya sama di semua sistem operasi utama?

Di linux bahkan akan mencoba mendistribusikan datagram secara merata di antara 2 soket, jadi acak. Anda perlu mengubah cara Anda mengirim/menerima paket.

person rinn2883    schedule 19.04.2017
comment
Ketika dua soket UDP diikat ke port yang sama dan paket unicast masuk diterima pada port tersebut, paket tersebut akan diserahkan ke salah satu dari dua soket (dipilih secara sewenang-wenang). Jika paket yang masuk adalah paket UDP multicast, OTOH, maka akan diserahkan ke setiap soket yang terikat pada port. (Perilaku terakhir ini diperlukan untuk memungkinkan beberapa program pada host yang sama mendengarkan grup multicast yang sama secara bersamaan) - person Jeremy Friesner; 19.04.2017
comment
poin bagus. Saya tidak memasukkannya karena op tidak menyebutkan penggunaan multicast. - person rinn2883; 19.04.2017
comment
Terima kasih teman-teman, Jadi bagaimana saya bisa mengatasi masalah ini? Karena saya mengirim paket melalui internet, bisakah saya mengirimkannya dalam mode multicast? - person mehrdad fallahpour; 20.04.2017
comment
itu tergantung karena VoIP adalah perangkat lunak tertutup maka harus ada dukungan untuk mendengarkan alamat multicast. Untuk mengirim tidak perlu bergabung dengan grup multicast tetapi untuk menerimanya perlu bergabung dalam grup. - person rinn2883; 21.04.2017