Forum: PC-Programmierung C++ Udp Broadcast empfangen und antworten


von Günther (Gast)


Lesenswert?

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

von Rolf Magnus (Gast)


Lesenswert?

Günther schrieb:
> 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?

Weder noch. Du schickst einfach mit sendto deine Antwort an si_other.

von Günther (Gast)


Lesenswert?

Ok, klappt tatsächlich. Danke.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.