【计网】理解TCP全连接队列与tcpdump抓包

在这里插入图片描述

希望是火,失望是烟,
生活就是一边点火,一边冒烟。

1 TCP 全连接队列

1.1 重谈listen函数

这里我们使用之前实现的tcp_echo_server的客户端与服务端。
我们来看listen

LISTEN(2)                                    Linux Programmer's Manual                                                          
NAME
       listen - listen for connections on a socket

SYNOPSIS
       #include <sys/types.h>          /* See NOTES */
       #include <sys/socket.h>

       int listen(int sockfd, int backlog);

这里的第二个参数我们之前设置的是一个const常量,但是这个到底代表什么含义呢?今天我们就来学习一下。

当我们启动客户端和服务端时,我们能够通过netstat -natp查找到建立的两个连接!
在这里插入图片描述
分别是客户端到服务端与服务端到客户端的连接!我们将服务端的的accept注释掉来看:

    void Loop()
    {
   
        _isrunning = true;
        while (_isrunning)
        {
   
            sleep(
要实现tcpdump实时抓包,可以使用libpcap库。使用该库可以捕获网络数据包,并对其进行处理。可以在程序中设置回调函数,每当捕获到一个数据包时,回调函数就会被调用。 为了边缓存边写入数据,你可以将捕获到的每个数据包存储在内存缓冲区中,并定期将缓冲区中的数据写入文件中。具体实现上,你可以使用一个循环队列来实现缓冲区,当队列满时,将最早的数据包覆盖掉,从而实现循环缓存。 下面是一些伪代码来帮助你更好地理解: ```python import pcap import time # 打开网卡 pc = pcap.pcap() # 打开文件 f = open('output.pcap', 'wb') # 设置缓冲区大小 buffer_size = 1000 # 初始化一个循环队列 buffer = [None] * buffer_size head = 0 tail = 0 # 回调函数,在捕获到每个数据包时都会调用 def packet_handler(timestamp, packet): global head, tail, buffer # 将数据包存储在缓冲区中 buffer[tail] = packet tail = (tail + 1) % buffer_size # 缓冲区已满,写入文件并清空缓冲区 if tail == head: for i in range(buffer_size): if buffer[head] is not None: f.write(buffer[head]) buffer[head] = None head = (head + 1) % buffer_size # 刷新文件缓冲区 f.flush() # 设置回调函数 pc.setfilter('tcp') pc.loop(packet_handler) # 关闭文件 f.close() ``` 以上伪代码仅供参考,具体实现还需要根据实际情况进行调整。同时,需要注意的是,实时抓包可能会对系统性能产生影响,因此需要进行适当的优化。
评论 131
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

叫我龙翔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值