我正在尝试编写一个同时监听 IPv4 和 IPv6 地址的 Web 服务器。但是,我最初编写的代码不起作用。然后我发现 IPv6 结构适用于 IPv4 和 IPv6。所以现在我使用 IPv6 结构,但只有 IPv4 地址有效。这篇文章,为什么我不能将 ipv6 套接字绑定到链接本地地址,它说要添加server.sin6_scope_id = 5;
所以我这样做了,但它仍然不接受 IPv6 telnet 连接。任何帮助将不胜感激,因为我完全被难住了。
谢谢!
我的代码如下:
void initialize_server(int port, int connections, char* address)
{
struct sockaddr_in6 socket_struct;
/*Creates the socket*/
if ((sock_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
syslog(LOG_ERR, "%s\n", strerror(errno));
exit(EXIT_FAILURE);
}/*Ends the socket creation*/
/*Populates the socket address structure*/
socket_struct.sin6_family = AF_INET6;
if(address == NULL)
socket_struct.sin6_addr=in6addr_any;
else
{
inet_pton(AF_INET6, "fe80::216:3eff:fec3:3c22", (void *)&socket_struct.sin6_addr.s6_addr);
}
socket_struct.sin6_port =htons(port);
socket_struct.sin6_scope_id = 0;
if (bind(sock_fd, (struct sockaddr*) &socket_struct, sizeof(socket_struct)) < 0)
{
syslog(LOG_ERR, "%s\n", strerror(errno));
exit(EXIT_FAILURE);
}//Ends the binding.
if (listen(sock_fd, connections) <0)
{
syslog(LOG_ERR, "%s\n", strerror(errno));
exit(EXIT_FAILURE);
}//Ends the listening function
}//ends the initialize server function.