亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

求問,關于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 關注
  • 472 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號