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

How to find the source ip and port of a client that wants to connect to a listening socket?

我正在 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?

也许他们指的是客户端。

作为服务器,我可以select() 或 poll() 文件描述符来知道有多少客户端想要连接,为什么我不能在 accept() 之前获取他们的 ip 地址和端口连接?

不好意思,我的网络知识不是很丰富

谢谢。

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

selectpoll 只会在套接字上通知 activity 而不会提供更多详细信息。连接成功与否需要依赖accept

感谢大家的回答。我想出了解决我的问题的方法。所以我想我会 post 它作为我自己问题的解决方案。

可以在linux下使用iptables和netfilter_queue过滤掉SYN包。然后可以从数据包中读取所需的信息并将其重新插入到堆栈中,而无需 "accept"ing 它!

我试过了,很管用。 :)

谢谢大家的帮助。