2014-01-30 109 views
1

我收到错误“无法绑定套接字”,错误:10038,一个操作尝试的东西不是套接字。套接字被创建,但我无法绑定它。UDP无法绑定套接字

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"); 
    } 
+0

那么...标题和标签中提到的* threading *与此有什么关系?我没有看到任何线程工作,如果我这样做,如果它是一个侦听器,我不希望多个套接字成功绑定到相同的端口。 – WhozCraig

+0

我只创建一个线程。并在其中进行绑定。 il改变标题 – meWantToLearn

+0

你不是'绑定到套接字'。你正试图将一个套接字绑定到一个地址。 – EJP

回答

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的行之后。

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"; 
} 
+0

或者,'if(INVALID_SOCKET ==(s = socket(...)))'将执行赋值和比较。 – icabod

+0

它确实赋值为's',但它不会将* socket()*的结果赋值给's'。 – EJP

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

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