2017-06-24 3 views
0

Ich habe ein TCP Umgang mit Datenströmen. Es dauert 4096 Bytes gleichzeitig, aber ich brauche einen Weg, um die gesamte Socket-Größe zu finden, bevor sie empfangen wird. So kann ich feststellen, wie oft der Socket gelesen wird, bevor er den Socket wechselt. Es wird auch benachrichtigen, dass dies der letzte recv dieses Sockets ist, so dass ich etwas damit tun kann, bevor ich auf den anderen Socket wechsle, wenn dieser verfügbar ist.Wie finde ich heraus, wie viele Bytes in Socket vor dem Recv in Python?

def handle_tcp(self, sock, remote): 
    fdset = [sock, remote] 
    while True: 
     r, w, e = select.select(fdset, [], []) 
     # How to find out how much bytes need to be read from socket? 
     if sock in r: 
      non_blocking_calculation() 
      if remote.send(sock.recv(4096)) <= 0: break 
     if remote in r: 
      non_blocking_calculation() 
      if sock.send(remote.recv(4096)) <= 0: break 
+1

Was meinen Sie mit "Capturing the Last Send"? Möchten Sie die letzten gesendeten Daten behalten? Die letzte Menge an Bytes gesendet? Hoffe du kannst es ein bisschen klären! – Rezniaq

+0

@Rezniaq Ich will es nicht behalten, ich möchte nur benachrichtigt werden, dass dies der letzte recv() dieses Sockets ist, damit ich dann eine andere Funktion verarbeiten kann. Dann gehe zurück, um auszuwählen, um gegebenenfalls zum anderen Socket zu wechseln. Ich werde es jetzt korrigieren – Anderson

+0

@ Rezniaq z.B. nach 'select()', (decke (sizeofwholesocket/4096)) wird bestimmen, wie oft es gesendet wird – Anderson

Antwort

1

Sie haben mich dazu geschlagen. In Übereinstimmung mit Igor Kalinosvkiy Weg. Sie können dazu entweder FIONREAD verwenden oder MSG_PEEK verwenden und weiterlesen bis es leer ist. Zum Beispiel nach select().

import fcntl, termios, array, math 
... 
sock_size = array.array('i', [0]) # initialise outside While loop 
if sock in r: 
    fcntl.ioctl(sock, termios.FIONREAD, sock_size) 
    count = ceil(sock_size[0]/float(BUF_SIZE)) 
    print("Socket size: {} and count: {}".format(sock_size[0], count) 
0

Linux und Windows haben FIONREAD (Synonym SIOCINQ) ioctl dafür.

Python hat eine begrenzte Unterstützung des ioctl in Buchse und Fcntl Module aber in üblichen TCP Programmierung solcher ioctl ist nicht weit verbreitet. Normalerweise Sie nur setblocking (false) und lesen Sie alle verfügbaren Daten, bis BlockingIOError ausgelöst wird. Ore definieren eine Art von Nachrichten mit Kopfzeilen/Markierungen, die Größe/Grenzen angeben.

Verwandte Themen