【发布时间】:2015-09-08 04:22:33
【问题描述】:
我正在尝试将我的本地 IPv6 地址绑定到套接字。但总是得到“无效的论点”。我想将特定 IP 地址绑定到套接字的原因是,如果我不绑定错误“No route to host”出现。当我尝试使用下面的命令 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”绑定,但随后出现错误“No route to host”。
【问题讨论】:
标签: c sockets interface bind ipv6