我正在嘗試編寫一個監聽IPv4和IPv6地址的Web服務器。但是,我最初編寫的代碼無效。然後我發現IPv6結構既適用於IPv4也適用於IPv6。因此,現在我使用IPv6結構,但只有IPv4地址有效。這篇文章,why can't i bind ipv6 socket to a linklocal address,這表示要添加server.sin6_scope_id = 5;
所以我這樣做,但它仍然不接受IPv6 telnet連接。任何幫助將不勝感激,因爲我徹底難倒了。
謝謝!將套接字綁定到IPv6地址
我的代碼如下:
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.
我知道ipv6是64位的,所以使用ipv6的服務器必須在64位操作系統上運行。現在只需要使用ipv4,到目前爲止使用ipv6存在很多問題。 – GiantHornet
@GiantHornet:IPv6既不是32位也不是64位;它也可以在其他系統上運行。 –
@GiantHornet是啊,我不認爲這是正確的,因爲我的Ubuntu機是i686這是32位,並有一個IPv6地址 – tpar44