2013-01-16 53 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。