Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C套接字从accept返回的filedescriptor获取IP地址_C_Sockets_Unix_Fork_File Descriptor - Fatal编程技术网

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

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); 稍后(在一些其他方法之后和内部和代码)子进程将连接信息保存

我知道这个问题似乎很典型,而且回答了多次,但我认为如果你仔细阅读细节,它就不那么常见了(我没有发现)

关键是,我正在用c开发一个unix服务,它打开一个套接字并等待连接,当我有一个连接时,我创建一个新的进程来处理它,这样就可以同时打开多个连接

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()方法中对其进行了更改。非常感谢您的建议:)