Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何找到要连接到侦听套接字的客户端的源ip和端口?_Linux_Sockets_Tcp_Listen - Fatal编程技术网

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

Linux 如何找到要连接到侦听套接字的客户端的源ip和端口?,linux,sockets,tcp,listen,Linux,Sockets,Tcp,Listen,我在linux上使用tcp套接字侦听传入的tcp连接。插座为分块式 在调用accept()之前,我想知道什么客户端正在尝试连接到我的套接字。更具体地说,我想知道源IP和端口 现在,我做了一些阅读,发现有人说这是不可能的,因为源IP地址还不知道。我不明白。如果客户端通知服务器它想要连接,那么它必须发送一个SYN数据包,其中包含我想要的信息,对吗 (来源) 也许他们指的是客户方 作为一个服务器,我可以选择()或poll()文件描述符来知道有多少客户端想要连接,为什么我不能在接受()连接之前获取它们

我在linux上使用tcp套接字侦听传入的tcp连接。插座为分块式

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

现在,我做了一些阅读,发现有人说这是不可能的,因为源IP地址还不知道。我不明白。如果客户端通知服务器它想要连接,那么它必须发送一个SYN数据包,其中包含我想要的信息,对吗

(来源)

也许他们指的是客户方

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

对不起,我的人际网络知识并不丰富


多谢各位

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堆栈本身。。。