Forum: PC-Programmierung UDP Empfangsprobleme mit Winsock2


von winsock_user (Gast)


Lesenswert?

Hallo,

seit einer Weile versuche ich auf dem PC (Windows) einen UDP Server zum 
Laufen zu bringen. Der Client ist ein Mikrocontroller (Client) mit der 
IP Adresse: 192.168.0.10. Der PC hat die IP Adresse: 192.168.0.11. Mit 
Wireshark sehe ich die empfangenen UDP Frames. Ich verwende für die UDP 
Kommunikation einen weiteren Netzwerkadapter. Ich kann nicht 
nachvollziehen, warum ich auf meiner Windows Applikation keine UDP 
Frames vom Mikrocontroller empfangen kann.
1
#include "stdafx.h"
2
#include <winsock2.h>
3
#include <stdio.h>
4
#include <stdlib.h>
5
6
//Prototypen
7
int startWinsock(void);
8
int main()
9
{
10
  long rc;
11
  SOCKET s;
12
  char buf[256];
13
  char buf2[300];
14
  SOCKADDR_IN addr;
15
  SOCKADDR_IN remoteAddr;
16
  int remoteAddrLen=sizeof(SOCKADDR_IN);
17
18
  rc=startWinsock();
19
  if(rc!=0)
20
  {
21
    printf("Fehler: startWinsock, fehler code: %d\n",rc);
22
    return 1;
23
  }
24
  else
25
  {
26
    printf("Winsock gestartet!\n");
27
  }
28
29
  //UDP Socket erstellen
30
  s=socket(AF_INET,SOCK_DGRAM,0);
31
  if(s==INVALID_SOCKET)
32
  {
33
    printf("Fehler: Der Socket konnte nicht erstellt werden, fehler code: %d\n",WSAGetLastError());
34
    return 1;
35
  }
36
  else
37
  {
38
    printf("UDP Socket erstellt!\n");
39
  }
40
41
  // addr vorbereiten
42
  addr.sin_family=AF_INET;
43
  addr.sin_port=htons(7);
44
  addr.sin_addr.s_addr=htonl(INADDR_ANY);
45
46
  rc=bind(s,(SOCKADDR*)&addr,sizeof(SOCKADDR_IN));
47
48
  if(rc==SOCKET_ERROR)
49
  {
50
    printf("Fehler: bind, fehler code: %d\n",WSAGetLastError());
51
    return 1;
52
  }
53
  else
54
  {
55
    printf("Socket an Port 1234 gebunden\n");
56
  }
57
58
  // Daten austauschen
59
  while(1)
60
  {
61
    rc=recvfrom(s,buf,256,0,(SOCKADDR*)&remoteAddr,&remoteAddrLen);
62
    if(rc==SOCKET_ERROR)
63
    {
64
      printf("Fehler: recvfrom, fehler code: %d\n",WSAGetLastError());
65
      return 1;
66
    }
67
    else
68
    {
69
      printf("%d Bytes empfangen!\n", rc);
70
      buf[rc]='\0';
71
    }
72
    printf("Empfangene Daten: %s\n",buf);
73
74
    //Antworten
75
    sprintf(buf2,"Du mich auch %s",buf);
76
    rc=sendto(s,buf2,strlen(buf2),0,(SOCKADDR*)&remoteAddr,remoteAddrLen);
77
    if(rc==SOCKET_ERROR)
78
    {
79
      printf("Fehler: sendto, fehler code: %d\n",WSAGetLastError());
80
      return 1;
81
    }
82
    else
83
    {
84
      printf("%d Bytes gesendet!\n", rc);
85
    }
86
  }
87
  return 0;
88
}
89
90
int startWinsock(void)
91
{
92
  WSADATA wsa;
93
  return WSAStartup(MAKEWORD(2,0),&wsa);
94
}

von Peter II (Gast)


Lesenswert?

winsock_user schrieb:
> Ich kann nicht
> nachvollziehen, warum ich auf meiner Windows Applikation keine UDP
> Frames vom Mikrocontroller empfangen kann.

aktive Firewall?

von winsock_user (Gast)


Lesenswert?

Der Mikrocontroller ist mit dem PC via USB Ethernetadapter verbunden.
Umgekehrt funktioniert die UDP Kommunikation: PC - Client und 
Mikrocontroller - Server.

Ich kann mit Wireshark die UDP Frames vom Mikrocontroller sehen.

von winsock_user (Gast)


Lesenswert?

Kann es sein, dass die Windows Applikation auf die andere Netzwerkkarte 
(Internet) zugreift ?

von Peter II (Gast)


Lesenswert?

winsock_user schrieb:
> Ich kann mit Wireshark die UDP Frames vom Mikrocontroller sehen.

dies hängt aber meines Wissens vor der Firewall.

Und senden geht immer, weil die normale Fiewall nur eingehen packete 
blockiert.

von winsock_user (Gast)


Lesenswert?

Aber im umgekehrten Fall kann ich UDP Frames auf der PC Seite empfangen.
Verstehe ich absolut nicht!

von winsock_user (Gast)


Lesenswert?

Sobald der Mikrocontroller ein UDP Frame empfängt, wird in der 
echoserver_receive Callback Funktion ein UDP Frame zurückgesendet an den 
PC. Der Kann diese Nachricht empfangen. Warum funktioniert der 
umgekehrte Fall nicht ? Das mit der Firewall kann doch auch nicht sein ? 
Ich kann ja in dem funktionierenden Fall UDP Frames (Response Frame) auf 
der PC Seite empfangen.

von winsock_user (Gast)


Lesenswert?

Guten Morgen,

mir leuchtet es immer noch nicht ein. Warum kann die ankommenden UDP 
Frames vom Mikrocontroller zum PC mit Wireshark sehen ? In der Windows 
Applikation müsste ich diese UDP Frames ebenfalls sehen können.

von winsock_user (Gast)


Lesenswert?

Das Hausnetz hängt nicht an dem USB Ethernetadapter. Dafür verwende ich 
die interne Netzwerkkarte.

von Miška (Gast)


Lesenswert?

Befinden sich USB-Adapter und interne Netzwerkkarte evtl. im gleichen 
Subnetz (192.168.0.x)?
Das gäbe dann Probleme der beschriebenen Art.

von mario (Gast)


Lesenswert?

Schau mal hier: http://www.c-plusplus.de/forum/169861-full

Vielleicht startet der WSAStartup in der falschen Version (2.0 statt 
2.2)...

von winsock_user (Gast)


Lesenswert?

WSAStartup wird richtig ausgeführt. Es ist die Version 2.2.
1
 iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);

Interne Netzwerkkarte:
IP: 10.53.100.104
Sunbetzmakse: 255.255.252.0

USB Ethernet-Adapter:
IP: 192.168.0.11
Subnetzmaske: 255.255.255.0

von Miška (Gast)


Lesenswert?

> WSAStartup wird richtig ausgeführt. Es ist die Version 2.2.
1
iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
steht irgendwie im Gegensatz zu:
1
return WSAStartup(MAKEWORD(2,0),&wsa);

Bin zwar kein WinSock-Spezialist, aber:
1
s=socket(AF_INET,SOCK_DGRAM,0)
eventuell durch
1
s=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP)
ersetzen (es sei denn, IPPROTO_UPD == 0).

Die Subnetze sollten jedenfalls passen.

von bluppdidupp (Gast)


Lesenswert?

Hast du denn die Firewall mal testweise ausgeschaltet?

von winsock_user (Gast)


Lesenswert?

Ich habe bereits

s=socket(AF_INET,SOCK_DGRAM,0)

durch

s=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP)

ersetzt. Trotzdem hat sich nichts geändert.

von Peter II (Gast)


Lesenswert?

winsock_user schrieb:
> Trotzdem hat sich nichts geändert.

noch mal:

Hast du mal testweise die Firewall ausgeschaltet?
Hast du mit netstat mal genschaut ob der Port offen ist?

von winsock_user (Gast)


Lesenswert?

Ok, es liegt an der Firewall.

Danke für die Ratschläge!

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.