Hostadresse, die UDP-Pakete sendet, kann nicht aufgelöst werden

2169
Mike

Ich habe zwei C-Programme, die auf separaten Computern ausgeführt werden, und ich habe Probleme beim Senden von UDP-Paketen von einem Computer zum anderen. Ich habe die Client / Server-Kommunikationsteile auf dem gleichen Computer mit einem localhost getestet, und alles schien gut zu sein, daher glaube ich nicht, dass das Problem in meinem Code liegt. Das Serverprogramm läuft auf einem Ubuntu-Laptop und das Clientprogramm auf einem Windows XP-Desktop. Im Moment habe ich einfach beide über einen linksys wrt54gs-Router verbunden.

Bei jedem Verbindungsversuch erhalte ich vom Client-PC die Fehlermeldung "Adresse 10.0.24.100" kann nicht aufgelöst werden, wenn versucht wird, eine Verbindung herzustellen. (Ich kann etwas Code zur Verfügung stellen, wenn jemand denkt, dass dies helfen wird.) Es gibt mir auch den Windows-Socket-Fehlercode 11004.

"Der angeforderte Name ist gültig und wurde in der Datenbank gefunden, es wurden jedoch nicht die richtigen zugehörigen Daten aufgelöst. Das übliche Beispiel hierfür ist ein Host-Name-zu-Adresse-Übersetzungsversuch (mit gethostbyname oder WSAAsyncGetHostByName), der den Namen verwendet DNS (Domain Name Server). Ein MX-Eintrag wird zurückgegeben, aber kein A-Eintrag. Dies bedeutet, dass der Host selbst existiert, aber nicht direkt erreichbar ist. "

Ich habe keine Ahnung, wie ich Abhilfe schaffen kann. Der Host-PC gibt mir jedoch eine Erfolgsmeldung zum Senden von Daten. (Ist das, weil es UDP ist?)

Ich denke, das Problem hängt mit meiner mangelnden Netzwerkerfahrung zusammen. Ich versuche zum ersten Mal, UDP-Daten in C zu senden, und ich bin mir ziemlich sicher, dass der Client den Server nicht sehen kann, weil ich irgendwo in den Einstellungen nichts richtig gemacht habe. Ich bin neu im Linux-Netzwerk, daher bin ich nicht sicher, wie ich sicherstellen kann, dass der Client meinen Server in Linux sehen kann.

Ich habe bisher zwei verschiedene Router ohne Erfolg ausprobiert. Die LEDs leuchten, wenn ich die Ethernet-Kabel einstecke. Ich bin mir nicht sicher, was ich sonst noch mit dem Router tun muss, um diese Kommunikation zu erleichtern. Wie kann ich sicherstellen, dass sich die beiden Maschinen gegenseitig sehen können? Muss ich die IP des Routers / der Computer ändern? Wie würde ich das machen? Ich denke, da fehlt etwas Grundlegendes. Jede Hilfe wäre sehr dankbar.

AKTUALISIEREN

Hier ist der UDP-Clientcode:

int argc; char **argv;  #define DEFAULT_PORT 61003 #define DEFAULT_PROTO SOCK_DGRAM  ...  int UDPTrack(int argc, char **argv) {  short pan1, tilt1; char c = 'l'; char Buffer[128]; //server hardcoded in char *server_name= "10.0.24.100"; unsigned short port = DEFAULT_PORT; int retval, loopflag = 0; int i, loopcount, maxloop=-1; unsigned int addr; int socket_type = DEFAULT_PROTO; struct sockaddr_in server; struct hostent *hp; WSADATA wsaData; SOCKET conn_socket; //radar data struct struct RadarData { unsigned int messageID : 32; unsigned int time : 32; float az; float el; }; struct RadarData receivedData;  if (argc >1) { for(i=1; i<argc; i++) { if ((argv[i][0] == '-') || (argv[i][0] == '/')) { switch(tolower(argv[i][1])) { case 'p': if (!stricmp(argv[i+1], "TCP")) socket_type = SOCK_STREAM; else if (!stricmp(argv[i+1], "UDP")) socket_type = SOCK_DGRAM; else Usage(argv[0]); i++; break; case 'n': server_name = argv[++i]; break; case 'e': port = atoi(argv[++i]); break; case 'l': loopflag =1; if (argv[i+1]) { if (argv[i+1][0] != '-') maxloop = atoi(argv[i+1]); } else maxloop = -1; i++; break; default: Usage(argv[0]); break; } } else Usage(argv[0]); } }  if ((retval = WSAStartup(0x202, &wsaData)) != 0) { fprintf(stderr,"Client: WSAStartup() failed with error %d\n", retval); WSACleanup(); return -1; } else printf("Client: WSAStartup() is OK.\n");  //ERROR HAPPENS SOMEWHERE IN HERE  if (port == 0) { Usage(argv[0]); } // Attempt to detect if we should call gethostbyname() or gethostbyaddr() if (isalpha(server_name[0])) { // server address is a name hp = gethostbyname(server_name); } else { // Convert nnn.nnn address to a usable one addr = inet_addr(server_name); hp = gethostbyaddr((char *)&addr, 4, AF_INET); } if (hp == NULL ) { fprintf(stderr,"Client: Cannot resolve address \"%s\": Error %d\n", server_name, WSAGetLastError()); WSACleanup(); system("Pause");  exit(1); } else printf("Client: gethostbyaddr() is OK.\n"); 

Ich komme hier nie vorbei.

0
UDP-Streams verwenden keine Zustände oder Verbindungen, es handelt sich lediglich um Datenströme. Sie haben keine Verbindung zwischen Client und Server. Wie versuchen Sie, den Client mit dem Server zu verbinden? Sie können dies nur tun, indem Sie Client / Server in Ihrem Code implementieren. Sie können den Link zwischen beiden Maschinen mit Ping testen. Diogo vor 13 Jahren 0
Entschuldigung, ich hätte klarstellen sollen. Ich bezog mich auf den Computer, der Daten als "Client" empfängt, und auf den Computer, der Daten als "Server" sendet. Mike vor 13 Jahren 0
Um die Konnektivität zwischen beiden zu testen, können Sie einfach Ping verwenden. Wenn Ping funktioniert, können Sie Ihre Anwendung testen. Es wäre eine gute Teststrategie. Diogo vor 13 Jahren 1
Sie können Ihr Testbed-Netzwerk erheblich vereinfachen, indem Sie auf den Client- und Server-PCs einen NIC- oder USB-Ethernet-Adapter installieren und anschließend statische IP-Adressen zuweisen. Verbinden Sie die NICs über ein Crossover-Kabel oder jeden Ethernet-Port mit einem Switch miteinander. Sie haben jetzt das einfachste mögliche LAN. sawdust vor 13 Jahren 0
Ich bin jetzt in der Lage, den Laptop per Ping zu senden, indem er Daten vom Desktop empfängt (soll) und Daten empfangen. Ich erhalte immer noch die gleiche Fehlermeldung, wenn ich versuche, mein Programm zu verwenden. Mike vor 13 Jahren 0
UDP-Clientcode ist jetzt oben. Es ist erwähnenswert, dass dies als 'Client' funktioniert, wenn Daten von einem Localhost-UDP-Broadcast empfangen werden. Mike vor 13 Jahren 0

2 Antworten auf die Frage

1
Turbo J

In der MSDN- Referenz gibt es ein Beispiel für die Überprüfung des addrErgebnisses aus der inet_addr()Funktion. Sie können nur eine ungültige IP-Adresse eingeben.

Die Dokumentation für gethostbyname () legt nahe, dass Sie es auch dann aufrufen können, wenn der "Name" eine IP-Adresse ist - Sie müssen inet_addr()überhaupt nicht anrufen .

das macht für mich prinzipiell Sinn ... würde es Ihnen etwas ausmachen, etwas Code bereitzustellen? Vielen Dank. Mike vor 13 Jahren 0
0
RedGrittyBrick

Die Meldung "Adresse kann nicht aufgelöst werden" weist darauf hin, dass Sie möglicherweise eine falsche getHostByName()API-Funktion angeben

Beachten Sie, dass "localhost" ein gültiger Hostname ist, "10.0.24.100" jedoch nicht, obwohl einige APIs trotzdem das Richtige tun.

Ihr Client oder Server mit Namensauflösung (normalerweise DNS) ist möglicherweise falsch konfiguriert.

Wenn Sie ein kleines (aber kompilierbares) Beispiel Ihres Codes veröffentlichen, kann dies hilfreich sein.

Für interesse:

C: \> perl -MSocket -e "print inet_ntoa (scalar gethostbyname ('superuser.com'))" 64.34.119.12  C: \> perl -MSocket -e "print inet_ntoa (scalar gethostbyname ('localhost'))" 127.0.0.1  C: \> perl -MSocket -e "print inet_ntoa (scalar gethostbyname ('127.0.0.1'))" 127.0.0.1  C: \> perl -MSocket -e "print inet_ntoa (scalar gethostbyname ('10 .1.2.3 '))" 10.1.2.3 C: \> 
Ich habe den Code oben angegeben. Hoffentlich wird das mein Problem klären. Mike vor 13 Jahren 0