我正在尝试将本地IPv6地址绑定到套接字。但是总会得到“无效的参数”。我想将特定IP地址绑定到套接字的原因是,如果我不绑定错误,则会出现“没有路由到主机”的错误。当我尝试使用下面的命令ping IPv6地址时,它不起作用。

ping6 fe80::7ed1:c3ff:fe86


我必须指出我要从哪个接口发送数据包。

ping6 -I en1 fe80::7ed1:c3ff:fe86


这很好。因此,我认为如果将套接字绑定到接口,则可以成功发送数据包。
任何人都可以告诉我如何在不指定接口的情况下发送IPv6地址,或者如何解决此绑定问题?

这是代码。

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <netdb.h>

#define LOCALADDR "fe80::7ed1:c3ff:fe86:ddae"

int main(void)
{
int sock,status;
struct addrinfo local_addr;
struct addrinfo *servinfo;
char buffer[1024];

/* create a DGRAM (UDP) socket in the INET6 (IPv6) protocol */
sock = socket(PF_INET6, SOCK_DGRAM, 0);

if (sock < 0) {
    perror("creating socket");
    exit(1);
}

/*Binding specific interface to socket*/
memset(&local_addr, 0, sizeof(local_addr));
local_addr.ai_family = AF_INET6;
local_addr.ai_socktype = SOCK_DGRAM;
local_addr.ai_flags = AI_PASSIVE;

if ((status = getaddrinfo(NULL, "3535", &local_addr, &servinfo)) != 0) {
    fprintf(stderr, "getaddrinfo error: %s\n", gai_strerror(status));
    exit(1);
}

if (bind(sock, (struct sockaddr *) &local_addr, sizeof(local_addr)) < 0)
    error("ERROR on binding");


我还尝试将“ getaddrinfo”中的“ NULL”替换为“ LOCALADDR”。

if ((status = getaddrinfo(LOCALADDR, "3535", &local_addr, &servinfo)) != 0) {
    fprintf(stderr, "getaddrinfo error: %s\n", gai_strerror(status));
    exit(1);
}


而且我仍然遇到同样的问题。

我可以使用“ in6addr_any”成功绑定套接字,但是随后出现错误“没有路由到主机”。

最佳答案

那是本地链接的IPv6地址,而不是可路由的IPv6地址。链接本地地址特定于链接,并且每个链接可以具有与其他链接相同的地址。例如,如果您具有三个不同的接口,则可以为每个接口分配相同的链接本地地址。要使用本地链接地址,您需要指定接口,以便操作系统知道要使用哪个链接。所有接口在同一网络中将具有本地链接地址:fe80 :: / 10。

如果使用可路由的IPv6地址,则无需指定接口。

09-19 02:07