c - 套接字编程: bind()-invalid argument

标签 c sockets interface bind ipv6

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

ping6 fe80::7ed1:c3ff:fe86

我必须指出我想从哪个接口(interface)发送数据包。

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

这工作得很好。所以我想如果我将套接字绑定(bind)到接口(interface),那么我就可以成功发送数据包。 任何人都可以告诉我如何在不指定接口(interface)的情况下发送 IPv6 地址或如何解决这个绑定(bind)问题?

这是代码。

#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”绑定(bind),但随后出现错误“没有到主机的路由”。

最佳答案

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

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

关于c - 套接字编程: bind()-invalid argument,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30984656/

相关文章:

c - Sendto 返回随机值

c - 将 "struct sockaddr_in"传递给方法

java - 计算机唤醒后如何识别 MacOS 上断开的 Java 套接字连接

java - 类与接口(interface)上的 FindBugs 和 CheckForNull

c# - 如果我有两个接口(interface),一个类可以继承两者吗?

Java - 仅使用 "<? extends Interface>"与接口(interface)

c - 同时使用 rand() 和 rand_r() : is this simple example correct?

C中 "pow"函数的组成

c# - 对于此 C 代码,哪种编码方式是正确的?

c - 将 memcpy 与结构字段一起使用