在 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 并获得负数的主要内容,如果未能解决你的问题,请参考以下文章

ntohs, ntohl, htons,htonl对比详解

调用write函数失败,Bad file descriptor

sockaddr_in 中的 sin_port

转:为什么需要htons(), ntohl(), ntohs(),htons() 函数

socket编程为什么需要htons(), ntohl(), ntohs(),htons() 函数

socket编程为什么需要htons(), ntohl(), ntohs(),htons() 函数