Мне нужно реализовать простой сетевой протокол связи.
Я использую Python 3.7. Программа работает в режиме "localhost". Тем не менее, в локальной сети это не работает хорошо. Я инициирую socket
через socketserver
.
Мне удается установить соединение, но иногда в recv
программа просто зависает бесконечно. Ему удается передать несколько килобайт, но затем случайным образом блокирует все.
Режим блокировки установлен в true, поэтому я бы понял, если данные не были отправлены, но другая сторона отправила информацию. Так что же случилось? Информация не поступила? Или был удален по какой-то причине?
Есть ли надежный способ проверить, пришло ли сообщение (отправителем), и при необходимости повторно отправить данные?
def ReceiveRaw(self, msgLen):
msgOut = bytearray()
totalReceived = 0
while totalReceived < msgLen:
chunk = self.sock.recv(min(msgLen - totalReceived,2048)) #sometimes hangs here infinitely
if len(chunk) == 0:
raise RuntimeError("socket connection broken")
totalReceived+= len(chunk)
for b in chunk:
msgOut.append(b)
return msgOut