Вверх ↑
Ответов: 36
Рейтинг: 7
#1: 2024-11-25 18:36:36 ЛС | профиль | цитата
Подскажите кто может позязя.
Нужно переслать бинарник по TCP сокету частями по 4 килобайта.
На питоне это выглядит так:
b_ok = bytes("OK\r\n", 'utf-8')

# Send file over TCP socket in binary chunks of max 4 kBytes.
def send_file(self):
chunkSize = 4096
sizeBytes = os.path.getsize(self.binFilePath)
totalNofChunks = (sizeBytes + chunkSize - 1) / chunkSize
with open(self.binFilePath, "rb") as f:
chunkNr = 1
while True:
chunk = f.read(4096)
if chunk:
print("sending part %d of %d (%d bytes)" % (chunkNr, totalNofChunks, len(chunk)))
h = bytes(("!%04x" % (len(chunk) + 5)), 'utf-8') + chunk
result1 = self.send_command(h)
if result1 != b_ok:
return result1
chunkNr = chunkNr + 1
else:
break;
return b"OK\r\n"

def send_command(self, cmd):
totalSent = 0
while totalSent < len(cmd):
sent = self.socket.send(cmd[totalSent:])
if sent == 0:
raise RuntimeError("Socket connection broken TX")
totalSent = totalSent + sent

# print("Sent %d bytes, waiting for response..." % totalSent)

chunks = []
bytesReceived = 0
while 1:
chunk = self.socket.recv(1)
if chunk == b'':
print("RX %d bytes" % bytesReceived)
raise RuntimeError("Socket connection broken RX")
chunks.append(chunk)
bytesReceived = bytesReceived + len(chunk)
if chunk[-1:] == b'\n':
#if bytesReceived > 3:
break
data = b''.join(chunks)
#print("rx data = '%s'" % data)
return data
Знаю что должно быть не сложно, но не знаю как.

Спасибо за помощь!
карма: 0

0
Редактировалось 4 раз(а), последний 2024-11-25 19:00:02