Hallo,
ich habe im Internet ein Code Beispiel zum Empfangen eines UDP
Broadcasts gefunden, welches auf Anhieb funktioniert. Ich lasse das
ganze in einem Thread laufen und wenn ein UDP Telegram mit einer
bestimmten Zeichenkette eintrifft, wird etwas gemacht.
Nun soll das ganze mit der eigenen IP-Adresse auf dem selben Port
antworten.
Mir ist nicht ganz klar, wie ich mit den Socket und Port umgehen soll.
Muss ich den Socket mit close(s); schließen, dann kommplett neu aufbauen
und an eine bestimmte IP-Adresse binden und nach dem Senden der Antwort
das ganze wieder rückgängig machen?
Oder kann ich den Socket on the Fly kurz verändern?
OS ist Yocto Linux.
1 | void * udpbroadcast(void * param){
|
2 | sockaddr_in si_me, si_other;
|
3 | int s;
|
4 | assert((s=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP))!=-1);
|
5 | int port=6000;
|
6 | int broadcast=1;
|
7 | std::string recv;
|
8 | char *ip;
|
9 |
|
10 | setsockopt(s, SOL_SOCKET, SO_BROADCAST,
|
11 | &broadcast, sizeof broadcast);
|
12 |
|
13 | memset(&si_me, 0, sizeof(si_me));
|
14 | si_me.sin_family = AF_INET;
|
15 | si_me.sin_port = htons(port);
|
16 | si_me.sin_addr.s_addr = INADDR_ANY;
|
17 |
|
18 | assert(::bind(s, (sockaddr *)&si_me, sizeof(sockaddr))!=-1);
|
19 |
|
20 | while(1)
|
21 | {
|
22 | char buf[10000];
|
23 | unsigned slen=sizeof(sockaddr);
|
24 | recvfrom(s, buf, sizeof(buf)-1, 0, (sockaddr *)&si_other, &slen);
|
25 |
|
26 | recv = buf;
|
27 | ip = inet_ntoa(si_other.sin_addr);
|
28 | if(recv.compare("HELLO DEVICE") == 0){
|
29 | std::cout << "UDP Broadcast from: " << ip << "\n";
|
30 |
|
31 | //Antwort
|
32 |
|
33 | }
|
34 | }
|
35 | }
|
danke!
Günther