2015-11-11 144 views
0

我想通過套接字獲取IP地址。我的代碼:如何獲取套接字的IP地址C

 . 
     . 
     . 
int socket_server = socket(AF_INET, SOCK_STREAM, 0); 

adresse_serveur.sin_family  = AF_INET; // le domain 
adresse_serveur.sin_addr.s_addr = htonl(INADDR_ANY); 
adresse_serveur.sin_port  = htons(2018); 

int taille_de_structure = sizeof(adresse_serveur); 
bind(socket_server, (struct sockaddr*)&adresse_serveur, taille_de_structure); 
     . 
     . 
     . 
+3

http://linux.die.net/man/2/getsockname – user3528438

+0

聲音像XY。你試圖獲得你的IP,你認爲使用套接字是實現它的方法。事實並非如此。 – stark

+0

您的最終目標是運行TCP服務器,還是僅僅爲了獲取您的IP地址?請注意,您的機器通常至少有兩個IP地址(一個環回和一個以太網),如果您是多宿主機器,則可能更多。 – pat

回答

0

套接字已經被綁定到INADDR_ANY端口2018。它沒有比這更具體的地址。 INADDR_ANY表示該套接字將在其任何接口上的accept連接。它沒有連接,所以它沒有遠程地址。

由於插座顯然意在服務器中使用,您將需要調用listen,然後accept得到一個新的連接插座(假設的東西其實connects它)。連接的套接字將具有綁定到其本地和遠端的更具體的地址。通過調用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); 
} 
+0

請給我代碼源! – stevGates

+0

來源爲什麼?整個聽取和接受,或只是getsockname?只需谷歌的「例子」與您感興趣的具體功能。 – pat

+0

!!!該coode !!!! – stevGates