给定已建立的TCP会话的本地IP和端口,我可以找出哪一方发送了初始SYN吗?也就是说,这种联系是主动还是被动地打开了?我需要在Linux上使用C / C ++的东西。一个hacky方式可能是socket()/ listen()并捕获EADDRINUSE但我希望更清洁。我甚至不确定一旦会话建立,内核是否会跟踪它。
编辑:我也不想调用netstat(甚至是ss),因为两个太快都没有打开套接字。这段代码经常被调用。答案 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:port
和destination address:port
存储到两个表中。一个是SYN
的发件人,另一个是接收者。
现在,当您获得端口和IP地址时,请对目前存储的数据进行scan
。您还可以使用STL map
C++
来获得更快的结果。
由于可能有很多请求,map
可能会迅速填满,使查找速度变慢。我建议您也处理FIN
数据包,并根据该数据包从表中删除相应的条目。