我试图将我的本地IPv6地址绑定到套接字。但总是得到“无效论证”。我想将特定IP地址绑定到套接字的原因是,如果我不绑定错误“无路由到主机”出现。当我尝试用下面的命令ping一个IPv6地址时,它不起作用。套接字编程:bind() - 无效的参数
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”。
“'域'(第一个参数)应该是AF_INET6,而不是PF_INET6” 这在每个平台上都不是这样;在OS X“man”状态下,你应该使用PF _ * - 。 –
@ K.Biermann,苹果自己的在线手册页([1](https://developer.apple.com/library/ios/documentation/System/Conceptual/ManPages_iPhoneOS/man2/socket.2.html),[2] (https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man2/socket.2.html))不同,但[POSIX docs](http://pubs.opengroup。 org/onlinepubs/009695399/functions/socket.html)引用了符号的sys/socket.h,并且该头文件需要提供AF_INET6和朋友,但没有提及PF_ *符号在所有。 –
@ K.Biermann,如果你想编写* portable *代码,所以你使用'AF_ *'常量。如果您的平台使用与相应的标准AF_ *常量不同的值定义了'PF_ *'常量,或者它根本不提供'AF_ *'常量,那么是时候考虑找到一个不需要的工作开发这样一个不正常的环境。但我不认为OS X属于这一类。 –