2010-10-28 61 views
29

我無法搞清楚了這一點 - 我使用本指南與插座的工作用C - http://binarii.com/files/papers/c_sockets.txt插座 - 如何找出哪些端口和地址我分配

我試圖自動獲取我的IP和端口使用:

server.sin_port = 0;    /* bind() will choose a random port*/ 
server.sin_addr.s_addr = INADDR_ANY; /* puts server's IP automatically */ 
... 
... 
bind(int fd, struct sockaddr *my_addr,int addrlen); // Bind function 

成功綁定後,如何找出實際分配的IP和端口?

+0

實際上,當你指定INADDR_ANY時,發生的事情並不是它自動放置服務器的IP,它所做的是找到所有接口,並綁定到它們中的每一個。因此,你有很多正確的答案來解決你的問題。 – jer 2010-10-28 19:50:34

+0

恩 - 謝謝你。我正在處理的任務要求我使用指定的代碼自動獲取IP和端口,但我要打印服務器地址和端口以供客戶端連接到屏幕上。這是我想要弄清楚如何去做的。如果我使用sockaddr結構體,我只能得到0.0.0.0和端口0. – stringo0 2010-10-28 19:52:59

+1

請參閱http://stackoverflow.com/questions/2496302/how-can-i-obtain-the-local-tcp-port-and-ip - 我的客戶端程序的地址 – mark4o 2010-10-28 19:55:20

回答

60

如果它是一個服務器套接字,你應該打電話listen()您的插座上,然後getsockname()發現在其上偵聽的端口號:

struct sockaddr_in sin; 
socklen_t len = sizeof(sin); 
if (getsockname(sock, (struct sockaddr *)&sin, &len) == -1) 
    perror("getsockname"); 
else 
    printf("port number %d\n", ntohs(sin.sin_port)); 

對於IP地址,如果你使用INADDR_ANY然後服務器套接字可以接受任何機器IP地址的連接,而服務器套接字本身沒有特定的IP地址。例如,如果您的計算機有兩個IP地址,那麼您可能會在此服務器套接字上獲得兩個傳入連接,每個連接都具有不同的本地IP地址。您可以在套接字上使用getsockname()進行特定連接(您可以從accept()獲取),以便找出該連接上使用的是哪個本地IP地址。

+0

謝謝mark4o - 這很好!但是我仍然無法獲得地址 - 我仍然得到0.0.0.0 - 任何想法?謝謝! – stringo0 2010-10-28 23:41:05

+1

服務器套接字沒有特定的IP地址,機器可能有多個IP地址。如果你只是想得到一臺機器的地址,看看這個其他問題:http://stackoverflow.com/questions/212528/linux-c-get-the-ip-address-of-local-computer – mark4o 2010-10-28 23:53:17

+1

謝謝 - gethostname做了訣竅:) – stringo0 2010-10-29 20:13:31

4

代碼中的註釋錯誤。 INADDR_ANY不自動放置服務器的IP'。它基本上將0.0.0.0,出於mark4o的answer中解釋的原因。

+0

現在有很多意義。謝謝! – stringo0 2010-10-29 20:13:50