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

我用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楼。想来你没搞清。我不是不懂这个函数的原意。
是说我明明指定端口。。而程序在编译时却自动改变端口号。
造成我的客户端无法连接上我的服务端的指定端口?
要怎么才能连接上?
(我的客户端的指定端口和服务端的一样,这没有错)

慕工程0101907
浏览 418回答 1
1回答

慕虎7371278

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

相关分类

Java
WebApp