首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >套接字编程: bind()-invalid参数

套接字编程: bind()-invalid参数
EN

Stack Overflow用户
提问于 2015-06-22 16:02:17
回答 2查看 4.3K关注 0票数 2

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

代码语言:javascript
复制
ping6 fe80::7ed1:c3ff:fe86

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

代码语言:javascript
复制
ping6 -I en1 fe80::7ed1:c3ff:fe86

这个很好用。因此,如果我将套接字绑定到接口,那么我就可以成功地发送数据包。任何人都可以告诉我如何发送IPv6地址而不指定接口,或者如何解决绑定问题?

这是密码。

代码语言:javascript
复制
#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“。

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

我还是遇到了同样的问题。

我可以成功地将套接字绑定到"in6addr_any",但之后我会得到错误"No with to host“。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-22 16:27:19

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

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

票数 3
EN

Stack Overflow用户

发布于 2015-06-22 16:49:18

您创建的套接字不正确。“域”(第一个参数)应该是AF_INET6,而不是PF_INET6。我不确定这些值是否实际上扩展到了您环境中的不同值,但是AF_*宏就是为此指定的宏。

否则,对于接受连接的套接字,您应该以最初呈现的方式获得地址。特别是,getaddrinfo()的文档说

如果AI_PASSIVE标志是在hints.ai_flags中指定的,并且node为NULL,则返回的套接字地址将适合于对将accept(2)连接的套接字进行bind(2)。返回的套接字地址将包含“通配符地址”(INADDR_ANY表示IPv4地址,IN6ADDR_ANY_INIT表示IPv6地址)。通配符地址由打算在任何主机网络地址上接受连接的应用程序(通常是服务器)使用。如果node不是NULL,则忽略AI_PASSIVE标志。

因此,您当然可以并且很可能应该指定一个NULL第一个参数。

但是,请注意,getaddrinfo()返回一个链接的地址列表,在某些情况下,需要选择与第一个地址不同的地址列表。不过,我认为在这种特殊情况下,第一种情况应该是好的。

请注意,试图连接的客户端发出的“无宿主路由”消息并不一定表示服务器没有侦听。很可能是客户使用了错误的地址(c.f )。@RonMaupin的回答),或者,正如它所说,没有(已知的)路由通过网络从客户端到服务器。例如,由于路由器或防火墙的配置,可能会出现这种情况。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30984656

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档