【问题标题】:sin_port returned in getaddrinfo wrong在 getaddrinfo 中返回的 sin_port 错误
【发布时间】:2011-11-25 08:36:53
【问题描述】:

我正在编写一个服务器-客户端程序,在服务器中我使用服务器上的 getaddrinfo 和 getsockname 来获取有关本地 IP 地址和本地绑定端口号的信息。 使用此信息,我启动我的客户端程序并使用 getaddrinfo,然后打印出 servinfo 数据结构中的返回值: getaddrinfo(argc[1], argc[2], &hints, &servinfo); >> 服务器主机名和服务器端口号通过命令行传递。

但我注意到 servinfo 中的 sin_port 不是我通过命令行传递的端口。 1) 这个 getaddrinfo 是否返回客户端使用的端口号作为源端口号? 2)getaddrinfo 和套接字调用失败后的连接调用。我不知道为什么。如何调试?

我的客户端代码sn-p:

memset(&hints, 0 ,sizeof hints);
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
hints.ai_flags =  AI_CANONNAME | AI_NUMERICSERV;
getaddrinfo(argc[1], argc[2], &hints, &servinfo);

for (p = servinfo till p!=NULL)
    sockfd = socket(p->ai_family, p->ai_socktype, p->ai_protocol)
    connect(sockfd, p->ai_addr, p->ai_addrlen) >>>>> Connect not going through.

我这样启动我的客户端程序: ./a.out myservername 18844

谢谢!

【问题讨论】:

  • 你怎么知道 getaddrinfo() 没有因为错误而失败?您没有检查它的返回值是否为零。如果 gettaddrinfo() 失败,那么它当然不会将数据写入其输出参数。
  • 我用服务器名调用它。但是错过了在问题描述中添加。
  • 我将检查 getaddrinfo 的返回码。它不应该失败,因为我能够读取 servinfo 结构中返回的 IPv4 地址。
  • 我遇到了问题。 sin_port 应该使用 ntohl/ntohs 进行转换,并且应该使用正确的端口号。即使在服务器上,我也曾经弄错端口号。我将其转换为 ntohs 并在客户端使用它来连接到服务器。所以问题不在于将 sin_port 端口号从网络字节顺序转换为服务器和客户端上的可用形式。感谢所有的回复。他们提供了帮助。

标签: c linux sockets


【解决方案1】:

新答案:您只使用一个参数调用您的程序,因此argv[1] 包含"18844"argv[2] 是一个空指针。这将尝试连接到具有数字 IP 18844 和未指定端口号的主机(最终将为 0 并失败)。

旧答案:(相关但不是您的问题)sin_port 和整个sockaddr_in 结构是网络字节顺序。您需要将端口转换为ntohl 以将其用作数字,但最好不要接触sockaddr 结构的内部结构。相反,使用getnameinfoNI_NUMERICHOSTNI_NUMERICSERV 将地址恢复为基于字符串的数字形式,然后strtol 将端口(“服务”)号读取为整数。这甚至适用于非 IPv4 网络地址/协议系列(如 IPv6),并且不需要额外的代码来支持新的。

【讨论】:

  • 更不用说argc 不是argv 数组通常使用的名称。
  • 我会试试的。但是 sin_port 是客户端端口吗?还是应该与我通过命令行传递的服务器端口相同?对不起,我很困惑。
  • 您将 p->ai_addr 传递给 connect(),因此它将用作连接 to 的地址,即服务器的地址。如前所述,通过 strace 运行您的代码,您应该会看到调用 connect() 的参数。
  • 谢谢,IP 地址没问题。我明白那个。我在询问 sin_port,我认为它是客户端端口,客户端将用作与服务器进行任何通信的源端口。但我需要有人来澄清这一点。
  • @Vin:您最好将sin_port 转换为带有getnameinfo() 的文本,如R. 所述。
猜你喜欢
  • 2017-02-02
  • 2011-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-16
相关资源
最近更新 更多