UDP无法绑定插座

UDP unable to bind socket

本文关键字:插座 绑定 UDP      更新时间:2023-10-16

i得到错误"无法绑定插座",错误: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 : %dn%sn", 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 : %dn%sn", WSAGetLastError () ,
        gai_strerror ( WSAGetLastError ()));
    }
    else
    {
        printf (" Bound to socket .n");
    }

括号问题。

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

应该是

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

在您的代码中,在您的行之后为0或1。

您需要修复此行:

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)
{
   ...

值得注意的是,您的编译器可能会给您警告。它可能说的是"条件表达式中的分配"之类的话。您通常不应该忽略警告,因为它们可以帮助您捕获这样的微妙错误。

这没有分配给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";
}