在 sin_port 上使用 ntohl 并获得负数
Posted
技术标签:
【中文标题】在 sin_port 上使用 ntohl 并获得负数【英文标题】:ntohl used on sin_port and get negative nubmers 【发布时间】:2012-03-26 17:10:35 【问题描述】:我尝试在 C 语言的服务器应用程序中打印客户端端口。 但是我得到了客户端端口的负数,这是什么奇怪的行为:-/ 有谁知道哪里有问题? 导致问题的部分代码:
struct sockaddr_in client_address;
int chosenPort = (int) ntohl(client_address.sin_port);
pritf("Client port is %d, chosenPort");
我得到像 -2121400320 这样的端口。
【问题讨论】:
你不应该使用int
和%d
(但是unsigned int
和%u
),特别是。因为如果 sin_port
是 >32767 并且一个实现的 int
只有 16 位,你将再次看到负数。
【参考方案1】:
请改用ntohs()
- sin_port
是一个 16 位值。
【讨论】:
另外,请注意 ntohs() 返回“unsigned short”或 uint16_t。我被名称中的“s”弄糊涂了,在将数字转换为字符串值时使用了short并遇到了问题。【参考方案2】:首先你必须使用 ntohs 函数而不是 ntohl。 ntohs() 返回 16 位端口号,ntohl 将返回 32 位 IP 地址
现在,您可以使用 getpeername() 获取客户详细信息
语法:
#include <sys/socket.h>
struct sockaddr_in client_address;
int getpeername(int sockfd, struct sockaddr *client, socklen_t *addrlen);
您可以使用 man 命令找到更多详细信息..
【讨论】:
以上是关于在 sin_port 上使用 ntohl 并获得负数的主要内容,如果未能解决你的问题,请参考以下文章
调用write函数失败,Bad file descriptor
转:为什么需要htons(), ntohl(), ntohs(),htons() 函数