【发布时间】:2016-10-30 07:09:53
【问题描述】:
我正在使用自己的标头通过 UDP 从一台 PC 向另一台 PC 发送消息。用户可以为消息设置片段的大小,这意味着我必须将消息分成片段并将它们发送到其他 PC,我的代码应该工作什么(没有测试,因为接收是问题)。
现在,在接收方,我需要跟踪片段索引、总片段数和在我的标头中定义的其他一些内容,以检查可能的数据丢失,例如 (CRC)。但让我们回到问题上来。
我将每个收到的片段按其索引保存到list 中。所以假设标题中第一个片段的index 是1,所以我想将第一个片段保存在位置1。我在一段时间内一直这样做,直到我得到最后一个数据片段。但是有些东西不能正常工作。最后,我想按保存在列表中的顺序打印收到的消息,从index 1 直到使用''.join(list) 结束。
检查我的代码,它要么打印出分成片段的消息,要么当我移出while 循环的print 时,它什么也不打印,甚至没有打印Receive: 消息。
发送:
def send_loop(self):
global mType, fragSize, fragIndex, fragCount, crc
mType=0
fragSize=0
fragIndex=0
fragCount=0
crc=0
fragSize = int(input('Fragment size: ')) #max size of fragment
while True:
message = input('Enter message: ')
#sending text message
if (message[:2] == '-m'):
mType = 1 #text message
if message.startswith('-m '):
message = message[3:] # remove "-m "
fragCount = math.ceil(len(message) / fragSize) #rounding up number of fragments to send
while message!= '':
data = bytearray()
data.extend(message[:fragSize].encode('utf-8'))
fragIndex += 1
header = struct.pack('!hIIII', mType, fragSize, fragIndex, fragCount, crc)
self.sock.sendto(header + bytearray(data), (self.host, self.port))
message = message[fragSize:] #set start of message to the right by size of fragSize
接收:
def create_socket(self):
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind((self.host, self.port))
rec_list = []
while True:
data, addr = sock.recvfrom(65535)
header = data[:18]
data = data[18:]
(mType, fragSize, fragIndex, fragCount, crc) = struct.unpack('!hIIII', header)
#type of message is text
if mType == 1:
if len(rec_list) < fragCount:
rec_list = ['None'] * fragCount #empty list for messages of size fragCount
rec_list[fragIndex] = data.decode('utf-8')
print(
'\nTyp: ' + str(mType) +
'\nFragSize: ' + str(fragSize) +
'\nFragIndex: ' + str(fragIndex) +
'\nFragCount: ' + str(fragCount) +
'\nCRC: ' + str(crc)
)
msg = ''.join(rec_list)
print('\nReceived: ' + msg)
【问题讨论】:
-
我们还需要查看发送代码。
-
@JohnGordon 更新
-
while True可以让您的套接字保持侦听,但是,您需要知道何时完成接收数据,对吧? 似乎在某处缺少某个条件(或另一个嵌套的while循环)?另外,请记住,当您执行rec_list = ['None'] * fragCount时,您正在破坏您可能已经从之前的包中提取到rec_list中的任何信息,对吧? -
@BorrajaX 我会看看
while True,因为现在我觉得还可以,但是关于rec_list = ['None'],是的,我知道它会破坏以前的信息,我也需要修复它,因为我可以一个接一个地发送一条消息,它会不断重写list,但我还没有弄清楚我应该怎么做。非常感谢帮助。