2014-01-30 111 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) 
{ 
    ... 

值得注意的是你的編譯器很可能給你一個關於該行警告。它可能會說「像條件表達式中的賦值」。你通常不應該忽視警告,因爲它們可以幫助你捕捉這樣的細微錯誤。