gpt4 book ai didi

c++ - 确定谁打开了 TCP session

转载 作者:IT王子 更新时间:2023-10-29 00:35:31 26 4
gpt4 key购买 nike

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

编辑:我也不想调用 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 地址后,对目前存储的数据进行扫描。您还可以使用 C++STL map 来获得更快的结果。

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

关于c++ - 确定谁打开了 TCP session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21323512/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com