私はを使ってコールバックをCライブラリに登録するPythonライブラリを持っています。コールバックの署名である:この場合ctypesを使ってCバッファにrecv_intoを何度も繰り返しますか?
CFUNCTYPE(c_int_32, c_uint_32, POINTER(c_byte), POINTER(c_size_t))
、第3引数はCライブラリによって割り当てられたバイト配列へのポインタであり、第4引数は、その長さです。
私はsocket.recv_into
を呼び出すことにより、ネットワークからのデータをバイト配列に移入したいと思います。さらに重要なことは、私は完全にこのバイト配列を埋めるしたいと思います:つまり、この関数の第四引数よりrecv_into
戻っ少ないバイトならば、私は再びrecv_into
を呼び出すしたいと思います。
私の関数は次のようになりますと仮定します。
def callback(first, second, buffer, size):
total_read = 0
while total_read < size[0]:
total_read += some_socket.recv_into(buffer, size[0] - total_read)
# XXX: What happens here???
私の質問は:どのように私はrecv_into
への各呼び出しではなく、以前に書き込まれたデータを上書きするよりも、バッファに追加することを確実にするためにbuffer
の値を操作することができますか?
他の回答へのコメントに続きます:あなたはバッファのスライスをキャストし、 'recv_into'を実行するとうまくいきますか? 'ctypes.cast(buffer [start:end]、ctypes.POINTER(ctypes.c_byte))'のようになります。欠点は、スライスを終わらせなければならないということです。さもなければ、インタプリタは文字列が大きすぎると不満を持ちます。 – alexpeits
私はそうは思わない。バッファのスライスは、整数のリストを返します。これは、基になるバッファからコピーされているようです。それは投げられません。 – Lukasa