绑定方法给出错误10038(WSAENOTSOCK)

bind method giving error of 10038 (WSAENOTSOCK)

本文关键字:WSAENOTSOCK 10038 错误 方法 出错 绑定      更新时间:2023-10-16

我的bind()和sendto()方法有问题,该方法在WSAGetLastError()上给出10038,MSDN称其在套接字上的操作无效。我无法理解我的代码出了什么问题。我在TCP上测试了我的代码,它可以工作,但在UDP上不工作。我在其他帖子中也看到过同样的错误,但主要是套接字关闭的问题。提前谢谢。

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

这一行就是问题所在:

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

它将__ping_server_socket设置为比较结果(truefalse,转换为整数10),而不是socket()返回的值。您需要在赋值周围使用括号来覆盖默认的运算符优先级。

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

先例问题。应该是:

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