簡體   English   中英

C 套接字從接受返回的文件描述符獲取 IP 地址

[英]C socket get IP address from filedescriptor returned from accept

我知道這個問題似乎很典型並且多次回答,但我認為如果您閱讀詳細信息,它並不常見(我沒有找到)。

關鍵是我正在用 c開發一個unix 服務,它打開一個套接字並等待連接,當我有一個連接時,我創建一個新進程來處理它,所以可以同時打開多個連接

int newfd = accept(sockfd, (struct sockaddr *)&clientaddr, (socklen_t*)&clientaddr_size);

稍后(在其他一些方法和代碼之后和內部子進程將連接信息保存到 BBDD,我還需要在那個精確時刻獲取打開該連接的 IP 地址

由於可以同時有多個連接,並且我傳遞給 accept 方法的變量struct sockaddr_in clientaddr為所有進程共享的,因此我不確定以后從這種方式獲取 IP 地址信息是否是個好主意,因為然后我可以從另一個打開的連接中獲取 IP 地址

我希望能夠從我從接受方法(返回的整數)獲得的文件描述符int newfd訪問 IP 地址 有可能嗎? 還是我誤解了文件描述符功能?

好的。 感謝 @alk 和 @rileyberton 我找到了正確的使用方法, getpeername

int sockfd;

void main(void) {
    //[...]
    struct sockaddr_in clientaddr;
    socklen_t clientaddr_size = sizeof(clientaddr);
    int newfd = accept(sockfd, (struct sockaddr *)&clientaddr, &clientaddr_size);
    //fork() and other code
    foo(newfd);
    //[...]
}
void foo(int newfd) {
    //[...]
    struct sockaddr_in addr;
    socklen_t addr_size = sizeof(struct sockaddr_in);
    int res = getpeername(newfd, (struct sockaddr *)&addr, &addr_size);
    char *clientip = new char[20];
    strcpy(clientip, inet_ntoa(addr.sin_addr));
    //[...]
}

所以現在在一個不同的過程中,我可以獲得發起連接的客戶端的 IP 地址(在“字符串” clientip ),只攜帶使用 accept 方法獲得的文件描述符newfd

您可以使用getsockname() ( http://linux.die.net/man/2/getsockname ) 來獲取綁定套接字的 IP。

之前也回答過,在這里: C - 來自文件描述符的公共 IP

全狀態連接由兩個端點 Peer(address:port)<=>My(address:port) 唯一標識。 getpeername() 和getsockname() 都需要獲取此信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM