套接字已經被綁定到INADDR_ANY
端口2018
。它沒有比這更具體的地址。 INADDR_ANY
表示該套接字將在其任何接口上的accept
連接。它沒有連接,所以它沒有遠程地址。
由於插座顯然意在服務器中使用,您將需要調用listen
,然後accept
得到一個新的連接插座(假設的東西其實connect
s它)。連接的套接字將具有綁定到其本地和遠端的更具體的地址。通過調用getsockname
和遠程地址,您可以調用getpeername
來獲得本地地址。
這裏是一個TCP服務器可能是什麼樣子(所有錯誤檢查就留給讀者做練習):
struct sockaddr_in sin;
/* create socket */
int sd = socket(AF_INET, SOCK_STREAM, 0);
/* bind socket to port 2018, any interface */
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = htonl(INADDR_ANY);
sin.sin_port = htons(2018);
bind(sd, (struct sockaddr*)&sin, sizeof(sin));
/* start listening for connections */
listen(sd, 5);
/* accept connections forever */
while (1) {
struct sockaddr_in remote_sin;
socklen_t remote_sinlen = sizeof(remote_sin);
struct sockaddr_in local_sin;
socklen_t local_sinlen = sizeof(local_sin);
/* wait for a connection */
int nsd = accept(sd, (struct sockaddr*)&remote_sin, &remote_sinlen);
/* get the local address of the connected socket */
getsockname(nsd, (struct sockaddr*)&local_sin, &local_sinlen);
/* local address is in local_sin. local_sinlen should still be sizeof(local_sin).
* remote address is in remote_sin. remote_sinlen should still be sizeof(remote_sin).
*/
/* service connection, or fork a child to do it, or whatever... */
/* close the connection */
close(nsd);
}
來源
2015-11-11 15:53:33
pat
http://linux.die.net/man/2/getsockname – user3528438
聲音像XY。你試圖獲得你的IP,你認爲使用套接字是實現它的方法。事實並非如此。 – stark
您的最終目標是運行TCP服務器,還是僅僅爲了獲取您的IP地址?請注意,您的機器通常至少有兩個IP地址(一個環回和一個以太網),如果您是多宿主機器,則可能更多。 – pat