Forum: PC-Programmierung Winsock: UDP Empfang mit recv -> von welcher IP


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Markus (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich empfange UDP-Pakete mit dem Winsock-Aufruf "recv" (NICHT recvfrom, 
der wäre blockierend).
Konkret rufe ich also WSAAsynSelect auf, und in der Message-Behandlung 
kommt dann der recv-Aufruf.
Das funktioniert auch:


Der WSAAsyncSelect - Aufruf:
1
if (WSAAsyncSelect(s, Application->Handle, WM_USER, FD_ACCEPT | FD_READ | FD_CLOSE) == SOCKET_ERROR){
2
.
3
.
4
.

und die Message - Behandlung:
1
if (Msg.message == WM_USER) {
2
  if (WSAGETSELECTEVENT(Msg.lParam) == FD_READ) {  
3
    bytecount=recv(s, (char *) buf, BUFLEN, 0);
4
    if (bytecount == SOCKET_ERROR) {
5
        MessageBox(NULL, "Error", "Read", MB_OK);
6
    } else {
7
    ...

Wie kann ich die IP (und den Port) des Senders rausfinden?

Vielen Dank,
Markus

von Markus (Gast)


Bewertung
1 lesenswert
nicht lesenswert
Hat sich erledigt. Ich nutze jetzt doch die Funktion "recvfrom".

Markus

von c-hater (Gast)


Bewertung
-1 lesenswert
nicht lesenswert
Markus schrieb:

> Hat sich erledigt. Ich nutze jetzt doch die Funktion "recvfrom".

Hast du auch verstanden, warum das so sein muss? Bzw. wie man eine 
nichtblockierende Variante korrekt umsetzen müsste?

von Markus (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Naja, ich gehe davon aus, dass es nicht (so einfach?) möglich ist, bei 
recv die IP zu ermitteln.

Ich denke dass ich die nichtblockierende Variante korrekt umgesetzt 
habe. Ich habe im obigen Quelltext "recv" durch "recfrom" ersetzt (und 
natürlich die zusätzlichen Parameter übergeben). Da Dieser Aufruf in der 
Nachrichtenbehandlung erfolgt (also erst dann, wenn wirklich Daten 
angekommen sind) blockiert da auch nichts. Sehe ich das richtig, oder 
bist du anderer Meinung?

Markus

von Georg A. (georga)


Bewertung
0 lesenswert
nicht lesenswert
Auf anderen OS könnte man jetzt in den Flags zu recvfrom MSG_DONTWAIT 
setzen und es wäre non-blocking. Offensichtlich scheint das Windows 
nicht zu können, ausser man setzt gleich den ganzen Socket so.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.