Linux C++通讯架构【五】:网络通讯实战

网络通讯实战

  • socket:可理解为四元组关联的一个数字,具有唯一性,socket在unix上是一个文件描述符
  • 发包:
    • 包头结构:
      • 报文总长度Len:包头+包体
      • 消息类型:这个包需要用服务器的哪个函数处理。(服务器端有个(函数名:消息码)向量)
      • crc32校验码:确保数据包的数据没有被修改过
        • ccrc32类

        • Get_crc():给你一段buff,也就是一段内存,以及内存长度,计算出一个crc32值

        • 客户端的包头就有这个crc32的值了 =》 服务器也用同样的算法计算crc32的值(根据包体计算),并和包头的crc32比较

        • 有点类似摘要算法

    • 注意字节对齐问题

      • 如客户端发送的数据结构体长度是8字节,结果由于字节对齐问题,服务端收到16字节,包头包体读取混乱

      • 采用一字节对齐,不会进行填充。 #pragma pack(1)

    • 大小端问题:发包时需要本地序转网络序,收包时网络序转本地序。

    • 数据分片问题:MTU

      • 比如最大1.5k,我要发1M的数据,需拆分成66个包(分片)

      • 这66个分片可能走的网络路径都不一样,每个分片可能被再次分片(不过TCP本身会处理这个问题)

    • send():

      • 只负责发送到 发送缓存区

      • while循环发送:比如我想发1000个字节,发送缓存区满了,只发了100字节,那么就得while循环发送

  • 收包:

    • 先收包头

      • 如果包头没收完,只收了5字节,那我需要一个指针,指向后半部分包头的存储位置 buff[8],*precvbuf

      • 我们要求,客户端连接后,有义务主动给服务器发包,服务器接收包头+包体,并在前面加一个消息头 (如是否过期、连接池中的序号)

      • 内存攻击:消息头+包头+包体需要重新 new 内存,如果我想攻击你,我发个包头,将Len设为2000字节。这块内存需要在断开连接后,自己释放。=》但不是有MTU吗?呃,难道MTU无心之中解决了这个问题。。。

    • 收包体ÿ

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值