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

求问,关于htons函数的问题,具体请看下面的情况!

求问,关于htons函数的问题,具体请看下面的情况!

慕工程0101907 2021-10-13 14:11:12
我用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");---------------------------------------------------调试跟踪居然端口变成了3857。。这是为什么呀。。程序好像没错呀?下面这段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");不好意思。1楼。想来你没搞清。我不是不懂这个函数的原意。是说我明明指定端口。。而程序在编译时却自动改变端口号。造成我的客户端无法连接上我的服务端的指定端口?要怎么才能连接上?(我的客户端的指定端口和服务端的一样,这没有错)
查看完整描述

1 回答

?
慕虎7371278

TA贡献1802条经验 获得超4个赞

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的时候,直接去看端口的内存里的内容,就明白了。


查看完整回答
反对 回复 2021-10-17
  • 1 回答
  • 0 关注
  • 371 浏览

添加回答

举报

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