user2708351
user2708351

Reputation: 139

How to bind socket to local addreess with TCPv6

I have to port existing Win API application to work with TCPv6. Can't figure out how to bind socket to localhost.

Earlier was:

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); 

Now, I'm trying:

    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); 

And bind returns SOCKET_ERROR

There is a page from MS https://msdn.microsoft.com/en-us/library/windows/desktop/ms737937%28v=vs.85%29.aspx but there is no bind example

Upvotes: 0

Views: 337

Answers (1)

Jeremy Friesner
Jeremy Friesner

Reputation: 73304

I think what you want to do is this:

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);

Upvotes: 1

Related Questions