Próbuję napisać serwer sieciowy, który nasłuchuje na adresach IPv4 i IPv6. Jednak kod, który pierwotnie napisałem, nie działał. Następnie dowiedziałem się, że struktury IPv6 działają zarówno dla IPv4, jak i IPv6. Teraz używam struktur IPv6, ale działają tylko adresy IPv4. Ten post, why can't i bind ipv6 socket to a linklocal address, który powiedział, aby dodać server.sin6_scope_id = 5;
, więc zrobiłem to, ale nadal nie akceptuje połączeń telnet IPv6. Każda pomoc będzie ogromnie doceniona, ponieważ jestem całkowicie zdumiona.
Dzięki!Powiązanie gniazd z adresami IPv6
Moje kodu jest poniżej:
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.
co wiem, że ipv6 jest 64-bitowy, więc serwery korzystające z ipv6 muszą działać na 64-bitowych systemach operacyjnych. po prostu użyj teraz ipv4, na razie jest dużo problemów z używaniem ipv6. – GiantHornet
@GiantHornet: IPv6 nie jest ani 32-bitowy ani 64-bitowy; może działać również na innych systemach. –
@GiantHornet tak, nie sądzę, że to prawda, ponieważ moją maszyną ubuntu jest i686, która ma 32-bitową i ma adres IPv6 – tpar44