我正在编写一个服务器客户端程序,在服务器中我使用 getaddrinfo 和 getsockname 在服务器上获取有关本地 IP 地址和本地绑定端口号的信息。使用此信息,我启动客户端程序并使用 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.
Run Code Online (Sandbox Code Playgroud)
我像这样启动我的客户端程序:./a.out myservername 18844
谢谢 !
新答案:您仅使用一个参数调用程序,因此argv[1]contains"18844"和argv[2]是一个空指针。这将尝试连接到具有数字 IP 18844 和未指定端口号(最终为 0 并失败)的主机。
旧答案:(相关但不是你的问题)sin_port并且整个sockaddr_in结构采用网络字节顺序。您需要转换端口以ntohl将其用作数字,但最好永远不要接触sockaddr结构的内部结构。相反,使用getnameinfo和将地址恢复为基于字符串的数字形式,然后将端口NI_NUMERICHOST(“服务”)号读取为整数。这甚至适用于非 IPv4 网络地址/协议系列(如 IPv6),并且不需要额外的代码来支持新协议。NI_NUMERICSERVstrtol
| 归档时间: |
|
| 查看次数: |
4532 次 |
| 最近记录: |