如何查找想要连接到侦听套接字的客户端的源IP和端口?

时间:2015-05-27 06:30:26

标签: linux sockets tcp listen

我在linux上使用tcp套接字来侦听传入的tcp连接。套接字是阻塞类型。

我想在调用accept()之前找出客户端正在尝试连接到我的套接字。更具体地说,我想知道源IP和端口。

现在,我已经做了一些阅读,发现人们说这是不可能的,因为源IP地址尚未知晓。我不明白这一点。如果客户端通知服务器它想要连接,那么它必须已经发送了一个包含我想要的信息的SYN包,对吗?

(源) Obtaining the source IP and port of an INADDR_ANY client socket before the TCP three-way handshake?

也许他们指的是客户方。

作为服务器,我可以选择()或poll()文件描述符以了解有多少客户端要连接,为什么我不能在接受()连接之前获取他们的IP地址和端口?

对不起,我对网络的了解并不那么丰富。

谢谢。

2 个答案:

答案 0 :(得分:2)

accept为已建立的新连接返回新的套接字ID。如果accept失败,则无论如何都没有连接。 成功accept时使用新套接字,您可以使用getpeername来确定客户端详细信息。

selectpoll只会通知套接字上的活动,而不会提供更多详细信息。您需要依赖accept来检查连接是否成功

答案 1 :(得分:0)

感谢大家的回答。我找到了解决问题的方法。所以我想我会把它作为我自己问题的解决方案发布。

可以在linux下使用iptables和netfilter_queue并过滤出SYN数据包。然后,人们可以从数据包中读取所需的信息,然后将其重新插入到堆栈中,而不是接受它!

我试过这个并且它有效。 :)

谢谢大家的帮助。