我正在编写一个服务器-客户机程序,在服务器中,我在服务器上使用getaddrinfo和getsockname来获取有关本地IP地址和本地绑定端口号的信息。使用这些信息,我启动了我的客户端程序并使用getaddrinfo,然后打印出servinfo数据结构中的返回值: getaddrinfo(argc1,argc2,&hints,&servinfo);>>服务器主机名和服务器端口号通过命令行传递。
但我注意到servinfo中的sin_port不是我通过命令行传递的端口。1)此getaddrinfo是否返回客户端用作源端口号的端口号? 2)在getaddrinfo和socket调用失败后,我的connect调用。我不知道为什么。我如何调试它?
我的客户端代码片段:
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
谢谢!
发布于 2011-09-27 00:25:27
新答案:你调用你的程序时只有一个参数,所以argv[1]包含"18844",而argv[2]是空指针。这将尝试连接到具有数字IP 18844和未指定端口号的主机(最终将为0并失败)。
老答案:(相关但不是你的问题) sin_port和整个sockaddr_in结构是按网络字节顺序排列的。您需要使用ntohl转换端口才能将其用作数字,但是最好不要接触sockaddr结构的内部。相反,使用带有NI_NUMERICHOST和NI_NUMERICSERV的getnameinfo将地址重新转换为基于字符串的数字格式,然后使用strtol将端口号(“服务”)读取为整数。这甚至适用于非IPV4网络地址/协议族(如IPv6),并且不需要额外的代码来支持新的网络地址/协议族。
https://stackoverflow.com/questions/7558001
复制相似问题