用一下代码去bind本机的ipv6地址失败,但是绑定::1和0是可以的
{
int fd, on(1), res;
struct sockaddr_in6 addr;
memset(&addr, 0, sizeof(addr));
addr.sin6_family = AF_INET6;
addr.sin6_port = htons(port);
res = inet_pton(AF_INET6, "fe80::7e3a:9e2a:85e0:a9ae", &addr.sin6_addr);
fd = socket(AF_INET6, SOCK_STREAM, 0);
if(fd<0)
goto Fail;
res = setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));
if(bind(fd, (struct sockaddr*)&addr, sizeof(struct sockaddr_in6))<0)
goto Fail;
if(listen(fd, num)<0)
goto Fail;
return fd;
Fail:
err = errno;
socket_CloseFd(fd);
return -1;
}
本机的ipv6地址如下,不会有错
server 可以使用 addr.sin6_addr= in6addr_any 进行bind 那么该端口的数据都能收到。
但是client connect server的 fe80:xxxxxx 的本地链路地址会失败,
需要给server分配一个全球链路地址 比如 :2001:470:1f01:f52b::2/64
可以直接给server 手动添加 ip addr add 2001:470:1f01:f52b::2/64 dev eth0
然后client connect 到这个地址 server和 client 就可以正常进行通信。
监听本机, ip串用 ":::" 表示就可以了。
请检查一下ipv6的ip地址是否正确,将addr.sin6_addr = in6addr_any,bind成功,应该是你的ip地址有问题,另外,bind绑定的ip地址是本地地址,你指定的ip地址是不是本地ip地址。
附上程序
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <errno.h>
int main()
{
int fd , res;
int err;
struct sockaddr_in6 addr;
memset(&addr, 0, sizeof(addr));
addr.sin6_family = AF_INET6;
addr.sin6_port = htons(1000);
addr.sin6_addr= in6addr_any;
// res = inet_pton(AF_INET6, "fe80::7e3a:9e2a:85e0:a9ae", &addr.sin6_addr.s_addr);
printf("res %d\n", res);
fd = socket(AF_INET6, SOCK_STREAM, 0);
if(fd<0)
goto fail;
int on = 1;
res = setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));
if (res < 0) {
goto fail;
}
if(bind(fd, (struct sockaddr*)&addr, sizeof(struct sockaddr_in6))<0)
goto fail;
if(listen(fd, 5)<0)
goto fail;
return fd;
fail:
err = errno;
close(fd);
return -1;
}