gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 16:59:58 27 4
gpt4 key购买 nike

我知道这个问题看起来很典型并且回答了多次,但我认为如果您阅读了详细信息,它就不那么常见了(我没有找到它)。

重点是我正在用 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com