2010-03-22 33 views
3

我預備了一個簡單的工作項目,我試圖用socket編程在Unix開發環境的基本知識,熟悉自己。此時,我有一些基本的服務器端代碼和客戶端代碼設置進行通信。目前,我的客戶端代碼已成功連接到服務器代碼,服務器代碼向它發送測試消息,然後都退出。完善!這正是我想要完成的。現在我正在玩弄用於獲取有關這兩種環境(服務器和客戶端)的信息的函數。我想獲取本地IP地址和動態分配的客戶端TCP端口。我發現這樣做是getsockname()功能...如何獲取我的客戶端程序的本地TCP端口和IP地址?

//setup the socket 
if ((sockfd = socket(p->ai_family, p->ai_socktype, p->ai_protocol)) == -1) 
{ 
    perror("client: socket"); 
    continue; 
} 

//Retrieve the locally-bound name of the specified socket and store it in the sockaddr structure 
sa_len = sizeof(sa); 
getsock_check = getsockname(sockfd,(struct sockaddr *)&sa,(socklen_t *)&sa_len) ; 
if (getsock_check== -1) { 
    perror("getsockname"); 
    exit(1); 
} 

printf("Local IP address is: %s\n", inet_ntoa(sa.sin_addr)); 
printf("Local port is: %d\n", (int) ntohs(sa.sin_port)); 

但輸出始終是零......

Local IP address is: 0.0.0.0 
Local port is: 0 

沒有人看到什麼我可能或肯定我做錯了?

感謝這麼多提前爲您的幫助!

+0

也許這將幫助:http://serverfault.com/questions/447044 – yegor256 2012-11-09 12:27:59

回答

7

從你的代碼看起來你是不是在插座上做connectaccept。直到你已經這樣做了,你從getsockname得到的數據是不確定的。

+0

美妙,固定它。謝謝丹尼爾,馬克! – BeachRunnerFred 2010-03-22 22:56:12

3

我不認爲你可以有意識調用getsockname在這種情況下,直到你叫連接() - 直到它需要(或者被告知這樣做的明確)的內核不將其綁定到特定端口,並根據路由表選擇本地地址,從而選擇目的地。

+0

感謝您的幫助! – BeachRunnerFred 2010-03-22 23:01:07

相關問題