2013-11-24 61 views
0

服務器程序,我綁定IP 127.0.0.1,端口1234端口不相同,用netstat

然而,當我用netstat -lntpu找出哪些進程聽什麼端口..我找到我的服務器程序列出,但驚人的端口號是不是我已經分配!

這裏就是我指的是

Proto | Recv-Q | Send-Q | Local Address |  Foreign Address | State | PID/Program_name 

tcp | 0  | 0  | 127.0.0.1:53764 |  0.0.0.0:*  | LISTEN | 10545/server 

所以,如果我綁定的插座,1234爲什麼使用netstat上市53764行?

我能夠成功地將數據從客戶端傳輸到服務器並返回。但是這裏看起來很奇怪!

這裏的綁定代碼

struct sockaddr_in ser_addr 

ser_addr.sin_family=AF_INET; 
ser_addr.sin_port=1234; 
ser_addr.sin_addr.s_addr=inet_addr("127.0.0.1"); 

sd=socket(AF_INET,SOCK_STREAM,0); 
ret=bind(sd,(struct sockaddr*)&ser_addr,sizeof(ser_addr)); 
listen(sd,3); 
+2

請向我們展示您的代碼 – MeNa

回答

4

它必須與你的端口設置的字節順序。

價值1234由兩個八位字節{4, 210}的同時{210, 4}向你53764(一)

在指定的端口地址,你應該知道,這是一個16-bit port number, network byte ordered(從理查德·史蒂文斯UNIX網絡編程(B))。網絡字節順序是大端方案,而你的實現似乎有一個小端方案,因此你需要周圍切換字節:

ser_addr.sin_port = htons (1234); 

事實上,你應該這樣做的,即使字節排序是相同的,因爲在這種情況下,它是無操作的。 htons是你如何(從上面提到的同一本書引用)「轉換主機到網絡,短整數」。


(一)這是因爲數據類型中的八位字節的順序決定的價值是如何計算的:

4 * 256 + 210 = 1234 // or use (x << 8 | y) rather than 
210 * 256 + 4 = 53764 //  (x * 256 + y) if you wish 

(B)一本書,你如果你打算做任何嚴肅的網絡開發,真的應該有。

+0

謝謝!我使用了inet_addr,它轉化爲網絡的Big Endian格式,而我完全忘記了這個端口。有沒有像inet_addr這樣的函數? – RHLK

+0

@RHLK,是的,這是'htons'調用。它不會佔用一個字符串,但它不必要,因爲該端口不是一個可能複雜的點地址。 – paxdiablo

相關問題