如何找到要连接到侦听套接字的客户端的源 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
来确定客户端详细信息。
select
或 poll
只会在套接字上通知 activity 而不会提供更多详细信息。连接成功与否需要依赖accept
感谢大家的回答。我想出了解决我的问题的方法。所以我想我会 post 它作为我自己问题的解决方案。
可以在linux下使用iptables和netfilter_queue过滤掉SYN包。然后可以从数据包中读取所需的信息并将其重新插入到堆栈中,而无需 "accept"ing 它!
我试过了,很管用。 :)
谢谢大家的帮助。
我正在 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
来确定客户端详细信息。
select
或 poll
只会在套接字上通知 activity 而不会提供更多详细信息。连接成功与否需要依赖accept
感谢大家的回答。我想出了解决我的问题的方法。所以我想我会 post 它作为我自己问题的解决方案。
可以在linux下使用iptables和netfilter_queue过滤掉SYN包。然后可以从数据包中读取所需的信息并将其重新插入到堆栈中,而无需 "accept"ing 它!
我试过了,很管用。 :)
谢谢大家的帮助。