在发送之前给在要发送的内容包前加一个头部信息-->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]:]