我在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地址和端口?
对不起,我对网络的了解并不那么丰富。
谢谢。
答案 0 :(得分:2)
accept
为已建立的新连接返回新的套接字ID。如果accept
失败,则无论如何都没有连接。
成功accept
时使用新套接字,您可以使用getpeername
来确定客户端详细信息。
select
或poll
只会通知套接字上的活动,而不会提供更多详细信息。您需要依赖accept
来检查连接是否成功
答案 1 :(得分:0)
感谢大家的回答。我找到了解决问题的方法。所以我想我会把它作为我自己问题的解决方案发布。
可以在linux下使用iptables和netfilter_queue并过滤出SYN数据包。然后,人们可以从数据包中读取所需的信息,然后将其重新插入到堆栈中,而不是接受它!
我试过这个并且它有效。 :)
谢谢大家的帮助。