Hallo Leute,
ich habe folgendes vor: Ein in MS VS C++ geschriebenes Programm soll
einen (beliebigen) UDP-Port öffnen und darüber einen Broadcast ins
Netzwerk senden. Die Antworten werte ich dann aus. Umgesetzt habe ich
das etwa so:
- UdpSocket öffnen,
- Mit BeginReceiveFrom und einem Callback über EndReceiveFrom bearbeite
ich die empfangenen Meldungen.
- Gesendet habe ich mit Sentto.
1 | System::Void
|
2 | Trif_Scan::ThreadWork( System::Void )
|
3 | {
|
4 | //-- Port öffnen ----------------------------------------------------
|
5 | System::Net::Sockets::Socket^
|
6 | UpdSocket = gcnew System::Net::Sockets::Socket
|
7 | ( System::Net::Sockets::AddressFamily::InterNetwork, System::Net::Sockets::SocketType::Dgram, System::Net::Sockets::ProtocolType::Udp );
|
8 | UpdSocket->EnableBroadcast = true;
|
9 | UpdSocket->Bind( gcnew System::Net::IPEndPoint ( System::Net::IPAddress::Any, 65000 ) ); // <== HIER
|
10 |
|
11 | UpdSocket->BeginReceiveFrom( ... );
|
12 |
|
13 | System::Net::IPEndPoint^
|
14 | EndPoint = gcnew System::Net::IPEndPoint(
|
15 | System::Net::IPAddress::Parse( "90.119.79.255" ),
|
16 | 65000 );
|
17 | UpdSocket->SendTo( TxBuffer, 0, TxBuffer->Length,
|
18 | System::Net::Sockets::SocketFlags::None,
|
19 | EndPoint );
|
20 | }
|
Das ganze funktionert wie gewünscht. Mich stören allerdings folgende
Punkte:
Beim SentTo muss ich die Broadcastadresse (des/eines) Netzes direkt
angeben. Wie kann ich das so machen, das automatisch ein Broadcast (am
besten über alle verfügbaren Adapter) gesendet wird, ohne das Angeben zu
müssen? Ein System::Net::IPAddress::Broadcast tut garnichts. Ich habe
auch schon versucht, das Bind wegzulassen. Aber dann geht das
BeginReceiveFrom nicht, denn das erwartet ein Bind. Nutze ich nur das
BeginReceive (ohne From), so erhalte ich beim Empfang keine (gültige)
IP-Adresse des Absenders.