2012-03-09 13 views
4

我嘗試在我的服務器應用程序中打印客戶端端口在C. 但我得到負數的客戶端端口,什麼是奇怪的行爲: -/ 任何人有一個想法哪裏可能是一個問題?我的代碼
部分引起的問題:ntohl在sin_port上使用,並獲得負面的nubmers

struct sockaddr_in client_address; 
int chosenPort = (int) ntohl(client_address.sin_port); 
pritf("Client port is %d, chosenPort"); 

我得到端口像-2121400320。

+1

你不應該使用'int'和'%d'(但是'unsigned int'和'%u'')因爲如果'sin_port'大於32767,而一個實現的'int'只有16位,你將會再次看到負數。 – 2012-03-09 12:29:57

回答

6

改爲使用ntohs() - sin_port是一個16位值。

+0

好的,解決了,謝謝:) – user1097772 2012-03-09 08:24:42

+0

另外請注意,ntohs()返回「unsigned short」或uint16_t。我被名字中的「s」弄糊塗了,並且在將數字轉換爲字符串值時使用了short並且遇到了問題。 – YasserAsmi 2014-11-17 06:12:02

0

首先你必須用ntohs函數代替ntohl。 還有ntohs()返回16位端口號,再用ntohl將返回32位的IP地址

現在,您可以使用getpeername()

語法得到客戶的詳細資料:

#include <sys/socket.h> 
struct sockaddr_in client_address; 
int getpeername(int sockfd, struct sockaddr *client, socklen_t *addrlen); 

你可以找到更多的細節使用man命令。

相關問題