为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Cats萌萌 2023-03-19 22:18:58
我用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");
查看完整描述

2 回答

?
心有法竹

TA贡献1866条经验 获得超5个赞

htons 是把你机器上的整数转换成“网络字节序”, 网络字节序是 big-endian,也就是整数的高位字节在前面。 而我们常用的 x86 CPU (intel, AMD) 电脑是 little-endian,也就是整数的低位字节放在前面。举个例子吧。假定你的port是
0x1234,

在网络字节序里 这个port放到内存中就应该显示成
addr addr+1
0x12 0x34

而在x86电脑上,0x1234放到内存中实际是:
addr addr+1
0x32 0x12

htons 的用处就是把实际内存中的整数存放方式调整成“网络字节序”的方式。 

再次回楼主,你的问题就是我说的, htons(4367) 后,在x86机器上,就是变成了 3857,就是因为字节序被调整了,这是正确的. 4367十六进制是0x110F,由于是little endian所以在内存中存放的是
0x0F 0x11

htons后,变成网络字节续,也就是
0x11 0x0F
这个数字如果你去看了话,就是
3857.

 


查看完整回答
反对 回复 2023-03-22
?
MMMHUHU

TA贡献1834条经验 获得超8个赞

htons 是把你机器上的整数转换成“网络字节序”, 网络字节序是 big-endian,也就是整数的高位字节在前面。 而我们常用的 x86 CPU (intel, AMD) 电脑是 little-endian,也就是整数的低位字节放在前面。举个例子吧。假定你的port是
0x1234,

在网络字节序里 这个port放到内存中就应该显示成
addr addr+1
0x12 0x34

而在x86电脑上,0x1234放到内存中实际是:
addr addr+1
0x32 0x12

htons 的用处就是把实际内存中的整数存放方式调整成“网络字节序”的方式。 

再次回楼主,你的问题就是我说的, htons(4367) 后,在x86机器上,就是变成了 3857,就是因为字节序被调整了,这是正确的. 4367十六进制是0x110F,由于是little endian所以在内存中存放的是
0x0F 0x11

htons后,变成网络字节续,也就是
0x11 0x0F
这个数字如果你去看了话,就是
3857. 

你debug的时候,直接去看端口的内存里的内容,就明白了。

查看完整回答
反对 回复 2023-03-22
  • 2 回答
  • 0 关注
  • 95 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信