2016-04-12 6 views
0

Ich habe ein Problem mit Sendto-Funktion. Ich möchte Zeit vom UDP-Server bekommen. Mein Code wie folgt aus:Sendto Funktion zurück Fehler - UDP-Socket auf Windows

unsigned char msg[48]={010,0,0,0,0,0,0,0,0}; 
char* hostname=(char *)"tick.usno.navy.mil"; 
sockaddr_in server_addr; 
WSAData data; 
int result=WSAStartup(MAKEWORD(2, 2), &data); 
if (result != NO_ERROR) { 
    printf("WSAStartup failed with error: %d\n", result); 
    return 1; 
} 
int client_s = socket(AF_INET, SOCK_DGRAM,IPPROTO_UDP); 
if (client_s == INVALID_SOCKET) { 
    printf("socket failed with error: %ld\n", WSAGetLastError()); 
    WSACleanup(); 
    return 1; 
} 
unsigned short Port = 123; 
server_addr.sin_family = AF_INET;     // Address family to use 
server_addr.sin_port = htons(Port);   // Port num to use 
server_addr.sin_addr.s_addr = inet_addr(hostname); // IP address to use 
char out_buf[BUFFER_SIZE]; 
int retcode = sendto(client_s, reinterpret_cast<const char*>(msg), sizeof(msg), 0,(struct sockaddr *)&server_addr, sizeof(server_addr)); 
perror("sendto:"); 
if (retcode == SOCKET_ERROR) { 
    printf("sendto failed with error: %d\n", WSAGetLastError()); 
    closesocket(client_s); 
    WSACleanup(); 
    return 1; 
} 

Meine Ausgabe ist wie:

sendto:: No error 
sendto failed with error: 10013 

Wenn ich recive Daten mit recv versuchen, habe ich etwas falsch gemacht. Ich möchte Zeit von UDP-Server auf Windows mit C++ bekommen. Wo ist das Problem? Warum ein Fehler sagt keinen Fehler und einen Fehler 10013 und wie kann ich das beheben?

+0

Nicht verwandt mit Ihrem Problem, aber Sie wissen, dass der Wert "010" ist nicht * Dezimal * zehn? Es ist oktal und hat den Dezimalwert "8". –

+1

Sie sollten das Ergebnis von 'inet_addr' überprüfen und Sie sollten lesen [seine Dokumentation] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms738563 (v = vs.85) .aspx) . (Hinweis: Das ist keine Funktion zum Auflösen von Host-Namen.) – molbdnilo

Antwort

1

Die alte Antwort (unten gehalten) ist informativ, aber nicht korrekt für diesen Fall.

Das Problem ist am wahrscheinlichsten, diese beiden Linien

char* hostname=(char *)"tick.usno.navy.mil"; 
... 
server_addr.sin_addr.s_addr = inet_addr(hostname); // IP address to use 

Die inet_addr Funktion erwartet eine Dezimalschreibweise IPv4-Adresse. Kein ungelöster Hostname. Wenn keine gültige IPv4-Adresse mit gestrichelten Dezimalstellen bereitgestellt wird, gibt die Funktion INADDR_NONE zurück, was keine gültige Adresse ist und zu Problemen führen wird, wenn die Adresse z. sendto. Wird es den Fehler in der Frage gemeldet? Ich weiß es ehrlich gesagt nicht, aber es wird definitiv nicht wie erwartet funktionieren.

Um einen Hostnamen in eine IP-Adresse aufzulösen, sollten Sie getaddrinfo verwenden. Die verknüpfte Referenz enthält auch ein Beispiel für die Verwendung.


Der Fehler 10013 ist, wenn man sich zum Beispiel aussehen this Windows socket error referenceWSAEACCESS, dass es einige Berechtigungsprobleme gibt. Wenn Sie dann ein wenig suchen, werden Sie sehen, dass die Ports unter 1024 für das System reserviert sind, und Sie benötigen erhöhte Rechte, um sie zu verwenden.

Wenn Sie einen NTP-Server oder -Client erstellen möchten, müssen Sie Ihr Programm mit erhöhten Zugriffsrechten wie z. Verwenden Sie "Als Administrator ausführen".


Was die Nachricht

 
sendto:: No error 

es aus dem perror Anruf kommt man bedingungslos nach sendto nennen. Zunächst einmal unter Windows die Socket-Funktionen nicht gesetzt errno die perror verwendet. Zweitens ist der Zustand errno undefiniert, wenn der vorherige Aufruf nicht tatsächlich fehlgeschlagen ist.

So verwenden Sie es nicht unbedingt und verwenden Sie es nicht für die Windows-Socket-Funktionen.

+0

Sie sollten dennoch in der Lage sein, an Port 123 zu senden. – molbdnilo

+0

Wenn ich als Administrator laufen ist das gleiche. Für perror hast du recht. Lies nicht errno ist nur für Linux. –

+0

@neiic Aktualisiert meine Antwort –