2013-01-16 51 views
1

我嘗試使用IPv6和UDP在C中創建客戶端/服務器程序。當程序綁定套接字時,它將返回WSAError 10049.我知道這是地址名稱的問題,但沒有看到問題。我希望有人能幫幫忙。綁定()失敗,並與Windows套接字錯誤10049

struct sockaddr_in6 server, client; 
SOCKET sock; 
char buffer[BUFFERSIZE]; 
LPTSTR recvBuff[1024]; 
DWORD recvBuffLen = 1024UL; 
int len = sizeof(client); 

WORD wVersionRequested; 
WSADATA wsaData; 
wVersionRequested = MAKEWORD(1,1); 
WSAStartup(wVersionRequested, &wsaData); 

sock = socket(AF_INET6, SOCK_DGRAM, 0); 
if (sock < 0) 
    error("Fehler beim Anlegen des Sockets"); 

server.sin6_family = AF_INET6; 
server.sin6_port = htons(6000); 
server.sin6_addr = in6addr_any; 

if (bind(sock, (struct sockaddr *) &server, sizeof(server)) == -1) 
    error("Fehler beim binden des Sockets"); 
+0

什麼是「PORT」? –

+0

是的,它已被定義,我將代碼更改爲實際值 –

+0

根據許多Linux教程,您必須用'memset'sockaddr_in6'爲零。 (我知道這是Windows,但值得一試) –

回答

4

之前,你可以使用結構,你將不得不memset它爲零:

memset(server, 0, sizeof(struct sockaddr_in6)); 

的原因是struct sockaddr_in6結構包含你不初始化(如sin6_scope_id等領域)並且可能包含垃圾。

1

我有同樣的錯誤代碼在Windows下調用bind()時。

在我的情況的原因是不一樣的,在最初的海報的代碼,但我想對方會作出了同樣的錯誤,因爲我:

我所產生的本地地址上,我希望服務器在本地使用inet_addr()功能進行綁定。 我分配這個結果到本地地址結構struct sockaddr_in localaddr這樣:

localaddr.sin_addr.s_addr = htonl(inaddr);

inet_addr()已經返回字節的網絡秩序的地址,因此呼叫htonl(inaddr)是錯誤的,我的代碼,造成錯誤10049:

SOCKET tcpsock_bindlisten(unsigned short port, const char* bindaddr) 
{ 
    SOCKET srvsock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); 

    unsigned long inaddr = bindaddr ? inet_addr(bindaddr) : INADDR_ANY; 

    struct sockaddr_in localaddr; 
    memset(&localaddr, 0, sizeof(struct sockaddr_in)); 
    localaddr.sin_family  = AF_INET; 
    localaddr.sin_port   = htons(port); 

    // ERROR HERE! address returned from inet_addr is already in network-byte-order! 
    localaddr.sin_addr.s_addr = htonl(inaddr); 

    // CORRECT THIS WAY: 
    localaddr.sin_addr.s_addr = inaddr; 

    if (bind(srvsock, (struct sockaddr *) &localaddr, sizeof(localaddr)) != 0) 
    { 
     print_socketerror("tcpsock bind()"); 
     return INVALID_SOCKET; 
    } 

    if (listen(srvsock, SVRSOCK_BACKLOG) != 0) 
    { 
     print_socketerror("tcpsock listen()"); 
     return INVALID_SOCKET; 
    } 

    return srvsock; 
} 

當使用 「所有的本地接口」(INADDR_ANY)它的工作調用bind(),因爲這種巧合INADDR_ANY == htonl(INADDR_ANY)的:

int main() 
{ 
    ... 
    // this works for this special case: 
    SOCKET svrsock1 = tcpsock_bindlisten(4444, NULL); 

    // did not work! 
    SOCKET svrsock2 = tcpsock_bindlisten(5555, "192.168.0.123"); 
} 
+0

最終一樣的原因。您試圖綁定的IP地址是非本地的。 – EJP

0

我也遇到了同樣的錯誤。

@askMish 's answer是很正確的。我在一開始並不理解它,但我最終發現它。

這通常從綁定到一個無效的本地計算機的地址,企圖造成..

通常情況下,我們有我們的計算機在某些網關。

如果我們運行ipconfig,我們會發現IP地址是192.168.something。

這就是我們可以用來在代碼中綁定的IP。

當其他人應該連接公共IP(如果你可以上網,你肯定有一個),就像47.93.something,如果他們與你在同一局域網。

您需要在您的網關(可能是您的家人的路線)中找到該IP。