UDP Empfangsprobleme mit Winsock2

Gast #2814919
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
}
Gast #2815003
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.
Gast #2816018
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren