Tôi đang cố gắng viết một máy chủ web có thể nghe trên cả địa chỉ IPv4 và IPv6. Tuy nhiên, mã mà tôi viết ban đầu không hoạt động. Sau đó, tôi phát hiện ra rằng cấu trúc IPv6 hoạt động cho cả IPv4 và IPv6. Vì vậy, bây giờ tôi sử dụng cấu trúc IPv6 tuy nhiên, chỉ có các địa chỉ IPv4 hoạt động. Bài đăng này, why can't i bind ipv6 socket to a linklocal address, cho biết thêm server.sin6_scope_id = 5;
vì vậy tôi đã làm điều đó nhưng nó vẫn không chấp nhận kết nối telnet IPv6. Bất kỳ sự trợ giúp nào cũng sẽ được đánh giá cao bởi vì tôi hoàn toàn bối rối.
Cảm ơn!Các ổ cắm ràng buộc vào các địa chỉ IPv6
Mã của tôi là dưới đây:
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.
những gì tôi biết ipv6 là 64 bit, do đó, máy chủ sử dụng ipv6 phải đang chạy trên hệ điều hành 64 bit. chỉ cần sử dụng ipv4 cho bây giờ, có rất nhiều vấn đề bằng cách sử dụng ipv6 cho đến nay. – GiantHornet
@GiantHornet: IPv6 không phải là 32 bit hoặc 64 bit; nó có thể chạy trên cả hai hệ thống khác. –
@ GiantHornet yea, tôi không nghĩ điều đó đúng vì máy ubuntu của tôi là i686 là 32-bit và có địa chỉ IPv6 – tpar44