Sharthak Ghosh
Sharthak Ghosh

Reputation: 596

bind method giving error of 10038 (WSAENOTSOCK)

I am having a problem with the bind() and sendto() method which gives 10038 on WSAGetLastError(), which MSDN says invalid operation on socket. I cannot understand what is wrong with my code. I had tested my code on TCP and it was working but on UDP it is not working. I have seen other posts where people have had the same error, but its mostly a problem with socket closing. Thanks in advance.

    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;
           }
       }
   }
 }

Upvotes: 0

Views: 205

Answers (2)

user207421
user207421

Reputation: 310869

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

Precedence problem. It should be:

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

Upvotes: 0

Barmar
Barmar

Reputation: 780788

This line is the problem:

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

It's setting __ping_server_socket to the result of the comparison (true or false, which converts to the integers 1 or 0), not to the value returned by socket(). You need parentheses around the assignment to override the default operator precedence.

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

Upvotes: 1

Related Questions