gpt4 book ai didi

c - getaddrinfo 中返回的 sin_port 错误

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:41:46 25 4
gpt4 key购买 nike

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

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

我的客户端代码片段:

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

谢谢!

最佳答案

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

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

关于c - getaddrinfo 中返回的 sin_port 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7558001/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com