UDP无法绑定套接字

时间:2014-01-30 10:14:25

标签: c++ winsock

我收到错误“无法绑定套接字”,错误: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");
    }

3 个答案:

答案 0 :(得分:4)

括号问题。

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

应该是

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

在你的代码中''在你的行之后是0或1。

答案 1 :(得分: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)
{
   ...

值得注意的是,您的编译器可能会向您发出有关该行的警告。它可能会说“条件表达式中的赋值”。你通常不应该忽视警告,因为它们可以帮助你捕捉这样的细微错误。

答案 2 :(得分:0)

这不会分配给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";
}