แพ็กเก็ต UDP ไปยัง IP เฉพาะใน LAN

ฉันมีอุปกรณ์ฝังตัวใน LAN และแอปพลิเคชัน c++ ใน Linux ในคอมพิวเตอร์ ฉันได้ทำการออกอากาศ UDP บนที่อยู่ออกอากาศซับเน็ตของฉันจาก C++ และอุปกรณ์ของฉันส่งคืนข้อความพร้อมลายเซ็น ตอนนี้ทั้งคู่มีที่อยู่ IP ของกันและกันแล้ว ฉันต้องส่งแพ็กเก็ต UDP จาก C++ ไปยัง IP อุปกรณ์ของฉันโดยเฉพาะ การเรียกอุปกรณ์ของฉันครั้งแรกทำได้ผ่าน UDP แต่ใช้ตัวเลือกการออกอากาศในตัวเลือกซ็อกเก็ต การทดลองบางอย่างของฉันกับเครื่องมือสร้างแพ็กเก็ตทำให้ฉันรู้สึกว่า UDP ใช้ MAC ID เพื่อค้นหาปลายทาง ดังนั้นวิธีการใน C ++ ควรเป็นอย่างไรหากฉันต้องการส่งแพ็กเก็ต UDP ไปยัง IP เฉพาะของฉันใน LAN ของฉัน ขอบคุณ


person UB_Roy    schedule 02.07.2013    source แหล่งที่มา
comment
คุณได้ลองอะไรไปแล้ว? นอกจากนี้ ให้ตรวจสอบเกี่ยวกับสแต็ก ISO เพื่อทำความเข้าใจความแตกต่างระหว่าง MAC และที่อยู่ IP ซึ่งใช้ทั้งคู่ แม้ว่า MAC อาจเพียงพอบนสื่อทางกายภาพเดียวกัน (รวมถึงคลื่นวิทยุ) นอกจากนี้ คุณได้ลอง boost::asio แล้วหรือยัง?   -  person Geoffroy    schedule 02.07.2013


คำตอบ (3)


จากการตอบกลับของคุณต่อ stefaanv ดูเหมือนว่าคำถามของคุณคือ "ฉันจะรับที่อยู่ IP จากเธรด A ไปยังเธรด B ได้อย่างไร" โดยที่เธรด A ได้รับการตอบกลับข้อความออกอากาศและเธรด B จะทำเฉพาะอุปกรณ์ การสื่อสาร.

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

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

person Sam Skuce    schedule 02.07.2013

หากคุณส่งการออกอากาศและคาดหวังคำตอบผ่าน UDP คุณควรได้รับพร้อมกับ recvfrom โทร. เพื่อกรอกที่อยู่ของผู้ส่ง การเรียกที่เกี่ยวข้องเพื่อส่ง UDP พร้อมด้วยข้อมูลที่อยู่ที่ได้รับคือ sendto

person stefaanv    schedule 02.07.2013
comment
recvfrom กำลังทำงานบนเธรดที่แยกต่างหาก ฉันจำเป็นต้องรวบรวมข้อมูลที่นั่นและแชร์ข้อมูลนั้นกับเธรดหลัก ต้องการทราบว่าคำสั่งผสมของ 'recvfrom - sendto' นี้สภาพอากาศจะแชร์ข้อมูลปลายทางแม้ว่าจะอยู่ในเธรดที่แตกต่างกันก็ตาม - person UB_Roy; 02.07.2013
comment
หากใช้ตามที่เป็นอยู่ คุณสามารถส่ง sockaddr ไปยังเธรดอื่นพร้อมกับพารามิเตอร์ความยาวได้ หากจำเป็น สามารถแยกวิเคราะห์ sockaddr ได้ ให้ใช้ sockaddr_in จาก linux.die.net/man/7/ip - person stefaanv; 02.07.2013

คุณไม่ได้ระบุ O/S แต่...

คุณสามารถกำหนดให้ซ็อกเก็ต UDP ใช้ เชื่อมต่อ ได้หากต้องการ ซึ่งหมายความว่าการส่งเพิ่มเติมไปยังซ็อกเก็ตนั้นจะไปที่ IP ที่คุณ "เชื่อมต่อ" ไปด้วย ทั้งหมดนี้แม้ว่า UDP จะไม่มีการเชื่อมต่อก็ตาม

person Joe    schedule 02.07.2013
comment
ระบบปฏิบัติการคือ Ubuntu, รหัส IDE::Blocks และ gnu 4.7.3 โดยพื้นฐานแล้วฉันเป็นโปรแกรมเมอร์แบบฝังตัวที่เรียนรู้การเขียนโปรแกรมพีซีใน C ++ ฉันสร้างซ็อกเก็ตซึ่งมีประชากร sockaddr_in พร้อมที่อยู่ออกอากาศ ตั้งค่าตัวเลือกการออกอากาศและส่งแพ็กเก็ต (พร้อมบัฟเฟอร์ข้อมูลของฉัน) อุปกรณ์ของฉันกำลังฟังพอร์ตนี้และจับแพ็คเก็ต UDP นี้ตรวจสอบลายเซ็นและตอบสนองด้วยลายเซ็นในที่อยู่การออกอากาศนั่นเอง ส่วนนั้นก็ดูโอเค - person UB_Roy; 02.07.2013
comment
แต่จากนี้ไปฉันต้องส่งข้อมูลไปยังจุดหมายปลายทางของฉันโดยเฉพาะ - ไม่มีการออกอากาศ นั่นคือความคิดของฉัน ฉันอ่านแนวคิดการเชื่อมต่อในหน้าดังกล่าวข้างต้น ความคิดนั้นดูเหมือนจะโอเคสำหรับฉันอย่างน้อยก็ในช่วงเริ่มต้นตราบใดที่ฉันมีอุปกรณ์เพียงเครื่องเดียวในเครือข่าย จะมีประโยชน์มากกว่านี้ถ้าฉันได้รับโค้ดตัวอย่าง! อย่างไรก็ตาม จนถึงตอนนี้ฉันยังไม่ได้ลอง 'asio' เลย ลองอ่านดูบ้างแล้ว และรู้สึกว่ามันมีไว้สำหรับโครงการเครือข่ายขนาดใหญ่ จะดีใจถ้าฉันได้รับข้อมูลบางอย่างเกี่ยวกับการบังคับใช้ของไลบรารีดังกล่าวในโครงการเช่นนี้ ขอบคุณมาก - person UB_Roy; 02.07.2013