确定谁打开了TCP会话

时间:2014-01-24 02:48:27

标签: c++ c linux sockets network-programming

给定已建立的TCP会话的本地IP和端口,我可以找出哪一方发送了初始SYN吗?也就是说,这种联系是主动还是被动地打开了?我需要在Linux上使用C / C ++的东西。一个hacky方式可能是socket()/ listen()并捕获EADDRINUSE但我希望更清洁。我甚至不确定一旦会话建立,内核是否会跟踪它。

编辑:我也不想调用netstat(甚至是ss),因为两个太快都没有打开套接字。这段代码经常被调用。

1 个答案:

答案 0 :(得分:2)

始终客户端通过发送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。您还可以使用STL map C++来获得更快的结果。

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