C套接字从接受返回的文件描述符中获取IP地址

标签 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 地址

我希望能够从文件描述符int newfd 中访问IP 地址,该文件描述符是我从accept 方法中获取的(返回的整数)。是否可以?还是我误解了文件描述符函数?

最佳答案

好的。感谢@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 中),仅携带文件描述符 newfd通过 accept 方法获得。

关于C套接字从接受返回的文件描述符中获取IP地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20472072/

相关文章:

c - 如何获取C中对象中所有字符串的长度

c++ - void* 和 void** 有什么区别?

c - 如何在内存中查找返回指令

python - 被 Python 中的 read_all() 函数困住了吗?

c - TCP:建立TCP连接

c++ - 在 Unix 上分离命令行输出(处理与用户交互)的方法是什么?

c++ - C中main函数的第四个参数指向什么?

sockets - 为什么TCP套接字编程需要两个套接字(一个欢迎套接字和一个连接套接字)而UDP只需要一个?

Bash: 'sort' 如何对路径进行排序?

linux - 列出所有文件并找到特定文件位置