C套接字从accept返回的filedescriptor获取IP地址
我知道这个问题似乎很典型,而且回答了多次,但我认为如果你仔细阅读细节,它就不那么常见了(我没有发现) 关键是,我正在用c开发一个unix服务,它打开一个套接字并等待连接,当我有一个连接时,我创建一个新的进程来处理它,这样就可以同时打开多个连接C套接字从accept返回的filedescriptor获取IP地址,c,sockets,unix,fork,file-descriptor,C,Sockets,Unix,Fork,File Descriptor,我知道这个问题似乎很典型,而且回答了多次,但我认为如果你仔细阅读细节,它就不那么常见了(我没有发现) 关键是,我正在用c开发一个unix服务,它打开一个套接字并等待连接,当我有一个连接时,我创建一个新的进程来处理它,这样就可以同时打开多个连接 int newfd = accept(sockfd, (struct sockaddr *)&clientaddr, (socklen_t*)&clientaddr_size); 稍后(在一些其他方法之后和内部和代码)子进程将连接信息保存
int newfd = accept(sockfd, (struct sockaddr *)&clientaddr, (socklen_t*)&clientaddr_size);
稍后(在一些其他方法之后和内部和代码)子进程将连接信息保存到BBDD,我还需要,在那一刻获取打开正在处理的连接的IP地址
由于可以同时有多个连接,并且我传递给accept方法的clientaddr中的变量struct sockaddr\u在整个过程中都是共享的,因此我不确定以后从该方式获取IP地址信息是否是一个好主意,因为无法从另一个打开的连接获取IP地址
int newfd = accept(sockfd, (struct sockaddr *)&clientaddr, (socklen_t*)&clientaddr_size);
我希望能够从文件描述符int newfd
访问IP地址,该文件描述符是我从accept方法获得的(返回的整数)。可能吗?或者我误解了文件描述符函数?您将使用getsockname()
()获取绑定套接字的IP
以前也回答过,这里是:好的。多亏了@alk和@rileyberton,我找到了正确的方法:
因此,现在在一个不同的过程中,我可以获得发起连接的客户端的IP地址(在“字符串”中),该客户端只携带通过accept方法获得的文件描述符newfd
。状态完整连接由两个端点对等(地址:端口)My(地址:端口)唯一标识。获取此信息需要getpeername()和getsockname()。现在我已经看到了类似的方法,但是使用getpeername()方法:)我明白了。因此,您可能希望为自己的问题添加一个答案,甚至接受它。Ok的可能副本。这一个是的@JosephQuinsey,同样简单。。抱歉,我以前没有找到它…谢谢@RileBerton,它对我有效的正确方法是getpeername()(),我可以看到它与帖子非常相似,但有点混淆了这个问题,因为进程之间有太多的对话:p绑定套接字的IP地址不是他所要求的。阅读问题。不要声明addr\u size
为int
,而是声明为socklen\u t
。在调用getpeername()
时,将int*
强制转换为socklen\u t*
,可以隐藏socklen\u t
大小不同时可能出现的问题。对accept()
的调用也是如此。完成!我还在调用accept()方法中对其进行了更改。非常感谢您的建议:)