2016-04-11 12 views
0

Ich habe ein Problem mit der Bind() und sendto() -Methode, die 10038 auf WSAGetLastError() gibt, die MSDN sagt ungültige Operation auf Socket. Ich kann nicht verstehen, was mit meinem Code nicht stimmt. Ich hatte meinen Code auf TCP getestet und es funktionierte, aber auf UDP funktioniert es nicht. Ich habe andere Posts gesehen, bei denen Leute den gleichen Fehler hatten, aber es ist meistens ein Problem mit Socket Closing. Vielen Dank im Voraus.Bind-Methode geben Fehler von 10038 (WSAENOTSOCK)

int socket_func :: udpRelayCheck() 
    { 
     WSADATA __wsaData; 
     WORD __version = WSAStartup(MAKEWORD(2, 2), &__wsaData); 

     if (__version != 0) 
     { 
     WSACleanup(); 
     return 1; 
     } 

     SOCKET  __ping_server_socket; 
     sockaddr_in __ping_server_service; 

     if (__ping_server_socket = socket(AF_INET, SOCK_DGRAM, 0) == SOCKET_ERROR) 
     { 
     WSACleanup(); 
     return 2; 
     } 

     memset((void*)&__ping_server_service, 0, sizeof(__ping_server_service)); 

     __ping_server_service.sin_family = AF_INET; 
     __ping_server_service.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); 
     __ping_server_service.sin_port = htons(55555); 

     int __ping_server_service_length = sizeof(__ping_server_service); 

     char *__relayMessage = "connect"; 
     char __recvBuff[200] = ""; 
     char *__check_buffer = "star"; 

     if (bind(__ping_server_socket, (struct sockaddr *)&__ping_server_service, sizeof(__ping_server_service)) == INVALID_SOCKET) 
     { 
      cout << WSAGetLastError() << endl; 
      return -1; 
     } 
     while (1) 
     { 
      if (sendto(__ping_server_socket, __relayMessage,strlen(__relayMessage), 0, (struct sockaddr *)&__ping_server_service, __ping_server_service_length) == SOCKET_ERROR) 
     { 
      cout << WSAGetLastError() << endl; 
      return -1; 
     } 

     if (recvfrom(__ping_server_socket, __recvBuff, strlen(__recvBuff), 0, (SOCKADDR*)& __ping_server_service, &__ping_server_service_length) != SOCKET_ERROR) 
     { 
      if (strcmp(__check_buffer, __recvBuff) == 0) 
      { 
       __global_udp_relay_socket = __ping_server_socket; 
       __global_udp_relay_sockaddr = __ping_server_service; 

       WSACleanup(); 
       return 0; 
      } 
     } 
    } 
} 
+1

Benennen Sie Ihre Variablen nicht beginnend mit '__', das ist für die Implementierung reserviert. – Barmar

+0

was bedeutet das? –

+0

Variablen- und Funktionsnamen, die mit zwei Unterstrichen beginnen, sind reserviert. Sie dürfen diese Namen nicht in Ihren eigenen Variablen und Funktionen verwenden, um die Möglichkeit von Konflikten zu vermeiden. – Barmar

Antwort

1

Diese Linie ist das Problem:

if (__ping_server_socket = socket(AF_INET, SOCK_DGRAM, 0) == SOCKET_ERROR) 

Es __ping_server_socket das Ergebnis des Vergleichs (true oder false, die 1 oder 0 zu den ganzen Zahlen umwandelt) Einstellung, nicht auf den Wert zurück durch socket(). Sie benötigen Klammern um die Zuweisung, um die Standardoperatorrangfolge zu überschreiben.

if ((__ping_server_socket = socket(AF_INET, SOCK_DGRAM, 0)) == SOCKET_ERROR) 
+0

vielen dank! hat funktioniert !! –

0
if (__ping_server_socket = socket(AF_INET, SOCK_DGRAM, 0) == SOCKET_ERROR) 

Präzedenz Problem. Es sollte sein:

if ((__ping_server_socket = socket(AF_INET, SOCK_DGRAM, 0)) == SOCKET_ERROR)