2016-04-11 37 views
0

MSDN'de soket üzerinde geçersiz işlem olduğunu söyleyen WSAGetLastError() üzerinde 10038 veren bind() ve sendto() yöntemiyle ilgili bir sorun yaşıyorum. Kodumda neyin yanlış olduğunu anlayamıyorum. Kodumu TCP'de test ettim ve çalışıyordu ama UDP'de çalışmıyor. İnsanların aynı hatayı aldıkları diğer yayınları gördüm, ancak çoğunlukla soket kapanışı ile ilgili bir problem. Şimdiden teşekkürler.bağlama yöntemi 10038 (WSAENOTSOCK) hatası veriyor

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

Değişkenlerinizi, '__' ile başlayan adıyla adlandırmayın, bu uygulama için ayrılmıştır. – Barmar

+0

bu ne anlama geliyor? –

+0

İki altçizgi ile başlayan değişken ve işlev adları ayrılmıştır, çakışma olasılığını önlemek için bu değişkenleri kendi değişkenlerinizde ve işlevlerinizde kullanamazsınız. – Barmar

cevap

1

Bu çizgi sorunudur:

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

Bu karşılaştırmanın sonucuna __ping_server_socket kuruyor değil tarafından döndürülen değere, (tamsayılar 1 veya 0 dönüşür true veya false,) socket(). Varsayılan operatör önceliğini geçersiz kılmak için ödev etrafında parantezlere ihtiyacınız vardır.

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

çok teşekkürler! çalıştı! –

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

Öncelik sorunu. Olması gereken:

if ((__ping_server_socket = socket(AF_INET, SOCK_DGRAM, 0)) == SOCKET_ERROR) 
İlgili konular