调试跟踪居然端口变成了3857?这是为什么呀?程序好像没错呀?

我用htons()为什么转换后的端口会不一样?
比如我用htons(4367),调试的结果居然变为3857,
这是为什么?怎么解决啊?
------------------
int connectclient()
{

SOCKET s;
s=::socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN sin;
sin.sin_family=AF_INET;
sin.sin_port=htons(4367);
sin.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
---------------------------------------------------
下面这段1589居然变成了13574,好像指定端口居然成了随机端口了。
sockaddr_in client;
client.sin_family=AF_INET;
client.sin_port=htons(1589);
client.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");

Cats萌萌
浏览 96回答 2
2回答

心有法竹

htons 是把你机器上的整数转换成“网络字节序”, 网络字节序是 big-endian,也就是整数的高位字节在前面。 而我们常用的 x86 CPU (intel, AMD) 电脑是 little-endian,也就是整数的低位字节放在前面。举个例子吧。假定你的port是0x1234,在网络字节序里 这个port放到内存中就应该显示成addr addr+10x12 0x34而在x86电脑上,0x1234放到内存中实际是:addr addr+10x32 0x12htons 的用处就是把实际内存中的整数存放方式调整成“网络字节序”的方式。 再次回楼主,你的问题就是我说的, htons(4367) 后,在x86机器上,就是变成了 3857,就是因为字节序被调整了,这是正确的. 4367十六进制是0x110F,由于是little endian所以在内存中存放的是0x0F 0x11htons后,变成网络字节续,也就是0x11 0x0F这个数字如果你去看了话,就是3857. 

MMMHUHU

htons 是把你机器上的整数转换成“网络字节序”, 网络字节序是 big-endian,也就是整数的高位字节在前面。 而我们常用的 x86 CPU (intel, AMD) 电脑是 little-endian,也就是整数的低位字节放在前面。举个例子吧。假定你的port是0x1234,在网络字节序里 这个port放到内存中就应该显示成addr addr+10x12 0x34而在x86电脑上,0x1234放到内存中实际是:addr addr+10x32 0x12htons 的用处就是把实际内存中的整数存放方式调整成“网络字节序”的方式。 再次回楼主,你的问题就是我说的, htons(4367) 后,在x86机器上,就是变成了 3857,就是因为字节序被调整了,这是正确的. 4367十六进制是0x110F,由于是little endian所以在内存中存放的是0x0F 0x11htons后,变成网络字节续,也就是0x11 0x0F这个数字如果你去看了话,就是3857. 你debug的时候,直接去看端口的内存里的内容,就明白了。
打开App,查看更多内容
随时随地看视频慕课网APP