sock 中的send和recv

本文介绍在网络通信中如何通过添加头部信息来确保数据包的完整发送与接收。通过使用struct模块打包数据长度并附加到数据包前部,实现可靠的数据传输。接收端通过循环recv方法确保所有数据被正确接收。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在发送之前给在要发送的内容包前加一个头部信息-->struct.pack('I', len(data)),这个头部存储的是这个要发送的数据包的大小len(data)

 data = nsnode_info.SerializeToString()
 data = struct.pack('I', len(data))+data
 ret = sock.sendto(data, addr)

接收数据此时指定接收的大小1024字节,为了防止发送的数据过大,造成数据丢失,那么进行循环recv(),判断的条件是存储的头部信息,也就是发送的数据包的大小(pkSize + struct.unpack('I', data[:pkSize])[0])和当前接收到的数据包的大小比较,如果>=表示数据接收完毕,可以执行之后的操作,
data[pkSize:pkSize+struct.unpack('I', data[:pkSize])[0]]是去掉头部信息后的数据包
sock发送信息不是一个send对应一个recv,可以是多个send组成一个包,recv一起接收,所以一个数据包中可以有多个头部信息
data = data[pkSize+struct.unpack('I', data[:pkSize])[0]:]这是另一个包的去头部信息的数据包

while True:
    data += sock.recv(1024)  
    if len(data) >= (pkSize + struct.unpack('I', data[:pkSize])[0]):
        _data = data[pkSize:pkSize+struct.unpack('I', data[:pkSize])[0]]
        data_nsnode.append(_data)
        data = data[pkSize+struct.unpack('I', data[:pkSize])[0]:]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值