【问题标题】:UDP unable to bind socketUDP 无法绑定套接字
【发布时间】:2014-01-30 19:06:09
【问题描述】:

我收到错误“无法绑定套接字”,错误:10038,尝试对不是套接字的东西进行操作。套接字已创建,但我无法绑定它。

struct sockaddr_in  serverAddress ;   // declared as global
struct sockaddr_in  clientAddress ; // declared as global
int len=sizeof(struct sockaddr); // declared as global
SOCKET s = NULL ; // declared as global

memset (& serverAddress , 0 , sizeof ( serverAddress ));
serverAddress.sin_family = AF_UNSPEC ;
serverAddress.sin_addr.s_addr =INADDR_ANY;
serverAddress.sin_port = htons(12345);

if( s = socket(PF_INET,SOCK_DGRAM, IPPROTO_UDP) == INVALID_SOCKET)
    {
        printf (" Unable to create a socket \n");
        printf (" Failed with error : %d\n%s\n", WSAGetLastError () ,
            gai_strerror ( WSAGetLastError ()));
        exit (1);
    }
    else
    {
        std::cout<<"CREATED"<<std::endl;
    }

if( bind(s,(struct sockaddr *)&serverAddress,sizeof(serverAddress)) < 0)
    {
                printf (" Unable to bind socket \n");
        printf (" Failed with error : %d\n%s\n", WSAGetLastError () ,
        gai_strerror ( WSAGetLastError ()));
    }
    else
    {
        printf (" Bound to socket .\n");
    }

【问题讨论】:

  • 那么...标题和标签中提到的 threading 与此有什么关系?我没有看到任何线程工作,如果我看到了,如果它是一个侦听器,我不会期望多个套接字成功绑定到同一个端口。
  • 我只创建一个线程。并在其中进行绑定。我改变标题
  • 你不是'绑定[ing]到一个套接字'。您正在尝试将套接字绑定到地址。

标签: c++ winsock


【解决方案1】:

括号问题。

if( s = socket(PF_INET,SOCK_DGRAM, IPPROTO_UDP) == INVALID_SOCKET)

应该是

if((s = socket(PF_INET,SOCK_DGRAM, IPPROTO_UDP)) == INVALID_SOCKET)

在您的代码中,“s”在您的行之后是 0 或 1。

【讨论】:

    【解决方案2】:

    你需要修复这条线:

    if( s = socket(PF_INET,SOCK_DGRAM, IPPROTO_UDP) == INVALID_SOCKET)
    

    相等运算符(==)首先被执行,因此它创建一个套接字并检查它是否无效。但是,它从不将套接字信息分配给s。相反,它分配相等测试的布尔结果,这意味着s 可能设置为0

    您要么需要放入括号以更正执行顺序,要么只需将赋值移到单独的语句中。为了便于阅读,我推荐后者:

    s = socket(PF_INET,SOCK_DGRAM, IPPROTO_UDP);
    if (s == INVALID_SOCKET)
    {
       ...
    

    值得注意的是,您的编译器可能会向您发出有关该行的警告。它可能会说“条件表达式中的赋值”之类的东西。您通常不应忽略警告,因为它们可以帮助您发现此类细微错误。

    【讨论】:

      【解决方案3】:

      这不会分配给 s ,因此我从来没有得到套接字号

      if( s = socket(PF_INET,SOCK_DGRAM, IPPROTO_UDP) == INVALID_SOCKET)
      {
      
      }
      

      这是正确的方法

      s = socket(PF_INET,SOCK_DGRAM, IPPROTO_UDP);
      if( s == INVALID_SOCKET )
      {
           echo "error";
      }
      

      【讨论】:

      • 另外,if (INVALID_SOCKET == (s = socket(...))) 将执行分配和比较。
      • 它确实赋值给's',但它没有把socket()的结果赋值给's'。
      猜你喜欢
      • 2015-08-02
      • 1970-01-01
      • 2011-03-16
      • 1970-01-01
      • 2023-03-23
      • 1970-01-01
      • 1970-01-01
      • 2011-08-11
      • 2021-11-16
      相关资源
      最近更新 更多