【问题标题】:bind method giving error of 10038 (WSAENOTSOCK)绑定方法给出错误 10038 (WSAENOTSOCK)
【发布时间】:2016-04-11 19:19:24
【问题描述】:

我遇到了 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;
           }
       }
   }
 }

【问题讨论】:

  • 不要以__ 开头的变量命名,这是为实现保留的。
  • 这是什么意思?
  • 两个下划线开头的变量和函数名是保留的,你不能在自己的变量和函数中使用这些名称,以免发生冲突。
  • 谢谢,以后不会用了

标签: c++ winapi network-programming


【解决方案1】:

这行是问题所在:

  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)

【讨论】:

    【解决方案2】:
    if (__ping_server_socket = socket(AF_INET, SOCK_DGRAM, 0) == SOCKET_ERROR)
    

    优先级问题。应该是:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-15
      • 2016-10-03
      • 1970-01-01
      • 2013-12-25
      • 2021-03-26
      • 1970-01-01
      • 1970-01-01
      • 2017-07-19
      相关资源
      最近更新 更多