[英]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.