C++ Udp Broadcast empfangen und antworten

Gast #4256384
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
Gast #4256587
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.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.