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

时间:2013-12-09 13:40:31

标签: c sockets unix fork file-descriptor

我知道这个问题似乎很典型并多次回答,但我认为如果您阅读详细信息并不常见(我没有找到)。

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

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

稍后(之后和其他一些方法和代码)子进程将连接信息保存到BBDD,我也需要,在那个精确的时刻,以获取IP地址打开正在处理的连接。

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

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

3 个答案:

答案 0 :(得分:12)

确定。感谢@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

答案 1 :(得分:3)

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

之前也回答过:C - Public IP from file descriptor

答案 2 :(得分:0)

全连接由两个端点Peer(address:port)<=> My(address:port)唯一标识。获取此信息都需要getpeername()和getsockname()。