Linux 如何找到要连接到侦听套接字的客户端的源ip和端口?
我在linux上使用tcp套接字侦听传入的tcp连接。插座为分块式 在调用accept()之前,我想知道什么客户端正在尝试连接到我的套接字。更具体地说,我想知道源IP和端口 现在,我做了一些阅读,发现有人说这是不可能的,因为源IP地址还不知道。我不明白。如果客户端通知服务器它想要连接,那么它必须发送一个SYN数据包,其中包含我想要的信息,对吗 (来源) 也许他们指的是客户方 作为一个服务器,我可以选择()或poll()文件描述符来知道有多少客户端想要连接,为什么我不能在接受()连接之前获取它们的ip地址和端口 对不起,我的人际网络知识并不丰富Linux 如何找到要连接到侦听套接字的客户端的源ip和端口?,linux,sockets,tcp,listen,Linux,Sockets,Tcp,Listen,我在linux上使用tcp套接字侦听传入的tcp连接。插座为分块式 在调用accept()之前,我想知道什么客户端正在尝试连接到我的套接字。更具体地说,我想知道源IP和端口 现在,我做了一些阅读,发现有人说这是不可能的,因为源IP地址还不知道。我不明白。如果客户端通知服务器它想要连接,那么它必须发送一个SYN数据包,其中包含我想要的信息,对吗 (来源) 也许他们指的是客户方 作为一个服务器,我可以选择()或poll()文件描述符来知道有多少客户端想要连接,为什么我不能在接受()连接之前获取它们
多谢各位 是
accept
为建立的新连接返回新的套接字id。如果accept
失败,则无论如何都没有连接。
当新套接字打开时,您可以使用getpeername
确定客户端详细信息
select
或poll
将仅通知套接字上的活动,而不会提供更多详细信息。您需要依靠accept
检查连接是否成功谢谢大家的回答。我想出了解决问题的办法。所以我想我应该把它作为我自己问题的解决方案
可以在linux下使用iptables和netfilter_队列并过滤掉SYN数据包。然后可以从数据包中读取所需的信息,并将其重新插入堆栈,而无需“接受”它
我试过这个,效果很好。:)
谢谢大家的帮助。接受连接,检查ip地址,然后在ip不正常时关闭连接。一旦我接受连接,客户端就会开始发送我尚未准备好处理的数据。我正在使用PEP(performance Enhancement proxy),我不想接受连接,除非我已经与客户端想要的实际服务器建立了连接。更清楚地说,我想作为服务器接收SYN请求,然后在发送SYN、ACK、,我想根据来自SYN的信息建立另一个连接。如果第二次连接成功,我将接受(),否则,我将立即接受()并关闭()套接字。我当前的问题是,建立第二个连接需要很长时间,因此我不希望客户端在准备就绪之前发送任何内容。您可以在Windows上执行此操作。不是在Linux上。但是“我不想接受连接,除非我已经与客户机想要的实际服务器建立了连接”,这是没有意义的。在与客户沟通之前,你怎么可能知道客户想要什么?谢谢你的回答,EJP。当你意识到这个政治公众人物是如何工作的时,这是有意义的。它愚弄客户机,使其认为它是服务器并连接它。但是使用不同的堆栈将数据实际发送到“真实”服务器。感谢您的及时回答。我的意思是我不想马上接受连接。如果我有一个传入连接,我想在接受()之前准备一些东西。我碰巧需要源代码使用的ip地址和端口。没有好的方法可以做到这一点吗?在
accept
之前,您没有任何试图连接的客户端的句柄。所以在那之前你什么都不能做。应用程序没有这种手段。如果我们可以调整TCP堆栈本身。。。