C套接字从accept返回的filedescriptor获取IP地址

Ale*_*eix 8 c unix sockets fork file-descriptor

我知道这个问题似乎是典型的,并且多次回答,但我认为如果您阅读细节并不常见(我没有找到它).

关键是我在c中开发了一个unix服务,它打开一个套接字并等待连接,当我有一个连接时,我创建一个新进程来处理它,因此可以同时打开多个连接.

int newfd = accept(sockfd, (struct sockaddr *)&clientaddr, (socklen_t*)&clientaddr_size);
Run Code Online (Sandbox Code Playgroud)

后来(后和其他一些方法里面和代码)子进程保存连接信息BBDD和我也需要,在那一时刻,以获取IP地址是打开的连接正在接受治疗.

因为可以同时存在多个连接,并且我传递给accept方法的变量struct sockaddr_in clientaddr为所有进程共享的,所以我不确定以后从这种方式获取IP地址信息是个好主意,因为那时我可以从另一个连接打开获取IP地址.

我希望能够从accept方法(返回的整数)中获取的文件描述符int newfd中访问IP地址.可能吗?或者我误解了文件描述符函数?

Ale*_*eix 13

好.感谢@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));
    //[...]
}
Run Code Online (Sandbox Code Playgroud)

所以现在在不同的过程中,我可以获得clientip发起连接的客户端的IP地址(在"字符串中" ),该连接仅携带newfd使用accept方法获得的文件描述符.