2015-05-29 78 views
0

我必須移植現有的Win API應用程序才能使用TCPv6。無法弄清楚如何將套接字綁定到本地主機。如何使用TCPv6將套接字綁定到本地用戶

早些時候:

struct sockaddr_in ServerAddress; 
 
ListenSocket = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, WSA_FLAG_OVERLAPPED); 
 
... 
 
ServerAddress.sin_family = AF_INET; 
 
ServerAddress.sin_addr.s_addr = inet_addr("127.0.0.1"); 
 
ServerAddress.sin_port = htons(nPortNo);

現在,我想:

struct sockaddr_in ServerAddress; 
 
    ListenSocket = WSASocket(AF_INET6, SOCK_STREAM, IPPROTO_TCP, NULL, 0, WSA_FLAG_OVERLAPPED); 
 
    ... 
 
    ServerAddress.sin_family = AF_INET6; 
 
    ServerAddress.sin_addr.s_addr = inet_addr("::1"); 
 
    ServerAddress.sin_port = htons(nPortNo);

,並綁定返回SOCKET_ERROR

有一個從MS https://msdn.microsoft.com/en-us/library/windows/desktop/ms737937%28v=vs.85%29.aspx一個頁面,但沒有綁定例如

+0

'inet_addr'返回一個unsigned long,究竟如何你期待爲了適應IPv6地址? –

回答

1

我想你想要做的是這樣的:

struct sockaddr_in6 ServerAddress; 
ListenSocket = WSASocket(AF_INET6, SOCK_STREAM, IPPROTO_TCP, NULL, 0, WSA_FLAG_OVERLAPPED); 
... 
ServerAddress.sin6_family = AF_INET6; 
if (InetPton(AF_INET6, "::1", sockAddr.sin6_addr.s6_addr) != 1) printf("error, inet_pton() failed!\n"); 
ServerAddress.sin6_port = htons(nPortNo); 
+0

您可以使用'in6addr_any'常數而不是使用'InetPton()'。另一種選擇是使用'getaddrinfo()'代替。但是,無論如何,您確實需要使用'sockaddr_in6'而不是'sockaddr_in'。 –

+0

綁定到in6addr_any會使端口在所有網絡接口上可用,而不僅僅是回送接口。 (這可能是好的,取決於你想做什麼,但它不像綁定套接字到本地主機,這是問題的要求) –

+1

對不起,我的意思是'in6addr_loopback',而不是,這是定義爲':: 1'地址。 –

相關問題