在发送之前给在要发送的内容包前加一个头部信息-->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]:]
本文介绍在网络通信中如何通过添加头部信息来确保数据包的完整发送与接收。通过使用struct模块打包数据长度并附加到数据包前部,实现可靠的数据传输。接收端通过循环recv方法确保所有数据被正确接收。
911

被折叠的 条评论
为什么被折叠?



