sock 中的send和recv
在發(fā)送之前給在要發(fā)送的內(nèi)容包前加一個(gè)頭部信息-->struct.pack('I', len(data)),這個(gè)頭部存儲的是這個(gè)要發(fā)送的數(shù)據(jù)包的大小len(data)
data = nsnode_info.SerializeToString()data = struct.pack('I', len(data))+dataret = sock.sendto(data, addr)接收數(shù)據(jù)此時(shí)指定接收的大小1024字節(jié),為了防止發(fā)送的數(shù)據(jù)過大,造成數(shù)據(jù)丟失,那么進(jìn)行循環(huán)recv(),判斷的條件是存儲的頭部信息,也就是發(fā)送的數(shù)據(jù)包的大小(pkSize + struct.unpack('I', data[:pkSize])[0])和當(dāng)前接收到的數(shù)據(jù)包的大小比較,如果>=表示數(shù)據(jù)接收完畢,可以執(zhí)行之后的操作,
data[pkSize:pkSize+struct.unpack('I', data[:pkSize])[0]]是去掉頭部信息后的數(shù)據(jù)包
sock發(fā)送信息不是一個(gè)send對應(yīng)一個(gè)recv,可以是多個(gè)send組成一個(gè)包,recv一起接收,所以一個(gè)數(shù)據(jù)包中可以有多個(gè)頭部信息
data = data[pkSize+struct.unpack('I', data[:pkSize])[0]:]這是另一個(gè)包的去頭部信息的數(shù)據(jù)包
總結(jié)
以上是生活随笔為你收集整理的sock 中的send和recv的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: glassfish插件_安装和使用Gla
- 下一篇: Vue入门之vue框架简介库和框架的区别