给定已建立的TCP会话的本地IP和端口,我可以找出哪一方发送了初始SYN吗?也就是说,这种联系是主动还是被动地打开了?我需要在
Linux上使用C/C++的东西.一个hacky方式可能是socket()/ listen()并捕获EADDRINUSE但我希望更清洁.一旦会话建立,我甚至不确定内核是否跟踪这个.
编辑:我也不想打电话给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扫描整个端口的速度很慢,那么实现快速性的唯一方法是打开原始套接字并将其设置为接收所有TCP数据包.
仅处理包含SYN的数据包.现在,将源地址:端口和目标地址:端口存储到两个表中.一个是SYN的发送者,另一个是接收者.
现在,当您获得端口和IP地址时,对目前存储的数据进行扫描.您还可以使用C的STL贴图来实现更快的结果.
由于可能有很多请求,地图可能会迅速填满,使查找速度变慢.我建议您也处理FIN数据包,并根据该数据包从表中删除相应的条目.