确定谁打开了一个TCP会话

给定一个build立的TCP会话的本地IP和端口,我可以找出哪一方发送了最初的SYN? 也就是说,这种联系是主动还是被动地打开? 我需要在Linux上使用C / C ++的东西。 一个黑客的方式可能是套接字()/听()和抓EADDRINUSE,但我希望有更清洁的东西。 我甚至不确定一旦会话build立,内核是否会跟踪这个。

编辑:我也不想打电话给netstat(甚至SS),因为两个打开很多套接字太慢。 这段代码会经常被调用。

始终客户端通过发送SYN (到服务器)进行主动连接。 因此,给定一个本地IP和端口号,使用下面的命令检查它是否是一个监听套接字:

 netstat --listening | grep given_ip:given_port 

如果这里没有列出,那么它是一个客户端套接字,从而启动一个SYN 。 如果它在那里,那么它是一个侦听套接字,因此它已经收到一个SYN

相应的代码如下所示:

 system("netstat --listening | grep given_ip:given_port > tmp.txt"); int fd = open("tmp.txt", O_RDONLY); char buf[100] ; if(read(fd,buf,100)>0) printf("The socket has received a SYN!"); else printf("The socket has sent a SYN!"); 

编辑:

如果你觉得netstat扫描整个端口的速度很慢,那么达到这个速度的唯一方法就是打开一个raw socket并将其设置为接收所有的TCP数据包。

只处理那些包含SYN数据包。 现在,将source address:portdestination address:port到两个表中。 一个是SYN的发送者,另一个是接收者。

现在,当您获得一个端口和IP地址, scan存储的数据到目前为止。 您也可以使用C++ STL map来获得更快的结果。

由于可以有很多请求,因此map可能会被迅速填满,从而使查找速度变慢。 我建议你也处理FIN数据包,并基于该数据包从表中删除相应的条目。