2017-06-24 14 views
0

私はデータのストリームを扱うTCPを持っています。一度に4096バイト必要ですが、私はrecvの前に全体のソケットサイズを見つける方法が必要です。これは、ソケットを切り替える前にソケットが何回読み取られるかを判断できるようにするためです。また、これがこのソケットの最後のrecvであることを通知するので、選択可能なスイッチが利用可能になった時点で他のソケットに切り替える前に何かできることがあります。Pythonでrecvの前にソケットのバイト数を調べる方法は?

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

「最後の送信をキャプチャする」とはどういう意味ですか?最後のデータを送信したままにしますか?最後に送られたバイト数?あなたは少しそれを明確にすることを望む! – Rezniaq

+0

@Rezniaq私はそれを保つつもりはない、私はちょうどこれがこのソケットの最後のrecv()であることを知りたいので、別の関数を処理することができる。次に、必要に応じて他のソケットに切り替えるために戻るように選択します。私は今それを修正します – Anderson

+0

@Rezniaq 'select()'(天井(sizeofwholesocket/4096))の後に何回送信するかを決定します – Anderson

答えて

1

あなたは私にそれを打ち明けました。イゴールKalinosvkiy方法に従って。これを行うには、FIONREADを使用するか、MSG_PEEKを使用し、空になるまで読んでください。たとえば、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

LinuxWindowsはそのためFIONREAD(同義語SIOCINQ)IOCTLを有しています。

Pythonはソケットfcntlののモジュールではなく、そのようなのioctlのは、広く使用されていない通常のTCPプログラミングの限定されたのioctlのサポートを持っています。通常はブロックをブロックfalse)だけ読み込み、BlockingIOErrorが発生するまで利用可能なすべてのデータを読み込みます。鉱石は、サイズ/範囲を指定するヘッダー/マーカーで何らかの種類のメッセージを定義します。

関連する問題