【发布时间】: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 端口号从网络字节顺序转换为服务器和客户端上的可用形式。感谢所有的回复。他们提供了帮助。