Paket UDP ke IP Tertentu di LAN

Saya memiliki perangkat yang tertanam di LAN saya dan aplikasi c++ di Linux di komputer. Saya telah membuat siaran UDP pada alamat siaran subnet saya dari C++ dan perangkat saya mengembalikan pesan dengan tanda tangan. Keduanya sekarang memiliki alamat IP satu sama lain. Saya perlu mengirim paket UDP dari C++ saya khusus ke IP perangkat saya. Panggilan awal ke perangkat saya dilakukan melalui UDP, tetapi menggunakan opsi siaran di opsi soket. Beberapa percobaan saya dengan alat pembuatan paket memberi saya kesan bahwa UDP menggunakan ID MAC untuk menemukan tujuan. Jadi metode apa yang harus digunakan di C++, jika saya ingin mengirim paket UDP ke IP spesifik di LAN saya? Terima kasih


person UB_Roy    schedule 02.07.2013    source sumber
comment
Apa yang sudah Anda coba sejauh ini? Juga, periksa tentang tumpukan ISO untuk memahami perbedaan antara MAC & alamat IP, keduanya digunakan, meskipun pada media fisik yang sama (termasuk gelombang radio) MAC sudah cukup. Juga, sudahkah Anda mencoba boost::asio?   -  person Geoffroy    schedule 02.07.2013


Jawaban (3)


Berdasarkan respons Anda terhadap stefaanv, sepertinya pertanyaan Anda sebenarnya "bagaimana cara mendapatkan alamat IP dari thread A ke thread B?", di mana thread A menerima respons terhadap pesan siaran, dan thread B melakukan spesifik perangkat komunikasi.

Salah satu cara Anda dapat melakukan ini adalah dengan membuat thread B dari thread A, dan meneruskan alamat IP sebagai argumen ke fungsi thread B. Dengan cara ini thread B akan mengetahui dari awal alamat IP mana yang harus diajak bicara.

Jika thread B harus aktif dan berjalan sebelum thread A, Anda dapat membagikan alamat IP menggunakan variabel global, dan menggunakan, misalnya. sebuah semaphore sehingga thread A dapat memberitahu thread B kapan thread tersebut telah menetapkan alamat IP. Pastikan saja bahwa thread A adalah satu-satunya thread yang menulis variabel global tersebut, atau Anda harus menyiapkan lapisan sinkronisasi lain, misalnya. menggunakan mutex, untuk memastikan bahwa penulisan ke alamat IP hanya dilakukan oleh satu thread dalam satu waktu.

person Sam Skuce    schedule 02.07.2013

Jika Anda mengirimkan siaran dan mengharapkan jawaban melalui UDP, Anda harus menerimanya dengan recvfrom panggilan. Ini mengisi alamat pengirim. Panggilan yang sesuai untuk mengirim UDP dengan informasi alamat yang diterima adalah sendto.

person stefaanv    schedule 02.07.2013
comment
Recvfrom berjalan di thread terpisah. Saya perlu mengambil data di sana dan membagikan data itu ke thread utama. ingin tahu apakah kombinasi 'recvfrom - sendto' ini akan membagikan info tujuan, meskipun keduanya berada di thread yang berbeda - person UB_Roy; 02.07.2013
comment
Jika digunakan apa adanya, Anda dapat meneruskan sockaddr ke thread yang berbeda bersama dengan parameter panjangnya. Jika diperlukan, sockaddr dapat diurai, gunakan sockaddr_in dari linux.die.net/man/7/ip - person stefaanv; 02.07.2013

Anda tidak menentukan O/S, tapi...

Anda dapat membuat soket UDP menggunakan connect jika Anda mau. Ini berarti bahwa pengiriman lebih lanjut ke soket itu akan menuju ke IP yang Anda "sambungkan", semua ini meskipun UDP tidak memiliki koneksi.

person Joe    schedule 02.07.2013
comment
OS adalah ubuntu, kode IDE :: Blok dan gnu 4.7.3 Saya pada dasarnya adalah seorang Programmer Tertanam yang mempelajari pemrograman PC dalam C++. Saya membuat soket, mengisi sockaddr_in dengan alamat siaran, mengatur opsi siaran dan mengirim paket (dengan buffer data saya). Perangkat Saya mendengarkan port ini dan menangkap paket UDP ini, memeriksa tanda tangan dan merespons dengan tanda tangannya di alamat siaran itu sendiri. Hingga bagian itu tampaknya baik-baik saja, - person UB_Roy; 02.07.2013
comment
tapi mulai sekarang saya perlu mengirim data khusus ke tujuan saya - tidak ada siaran. Itu adalah ideku. Saya membahas ide koneksi pada halaman yang disebutkan di atas. Gagasan itu tampaknya baik-baik saja bagi saya setidaknya pada awalnya selama saya hanya memiliki satu perangkat di jaringan. Akan lebih membantu jika saya bisa mendapatkan beberapa kode contoh! btw, sejauh ini saya belum mencoba 'asio'. Saya membacanya beberapa kali dan entah bagaimana mendapat kesan bahwa ini untuk proyek jaringan besar. Saya akan senang jika saya bisa mendapatkan masukan mengenai penerapan perpustakaan tersebut dalam proyek seperti ini. Terima kasih banyak - person UB_Roy; 02.07.2013