首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >getaddrinfo中返回的sin_port错误

getaddrinfo中返回的sin_port错误
EN

Stack Overflow用户
提问于 2011-09-27 00:11:23
回答 1查看 4.1K关注 0票数 1

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

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

我的客户端代码片段:

代码语言:javascript
复制
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

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-09-27 00:25:27

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

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7558001

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档