1

単純な tcp ソケット プログラムがあり、文字列を 10 バイトのチャンクで送信したいと考えています。サーバーはチャンクに参加します。ただし、文字列をバイナリに分割する方法と、バイナリのチャンクを送信する方法がわかりません。一度に 512 バイトを送信する代わりに、10 バイトを数回送信したいと考えています。

データをバイト文字列にシリアル化できるモジュール Pickle を見つけましたが (?)、これに socket.send() を適用するにはどうすればよいですか?

サーバ:

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(("", my_port))
server_socket.listen(5)
client_socket, address = server_socket.accept()
data = client_socket.recv(512)

クライアント:

message = "some string I want to send in chunks"
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect((host, my_port))
client_socket.send(message)
client_socket.close()
4

1 に答える 1

9

まず第一に、コードは実際には一度に 512 バイトを送信しているのではなく、一度に 512 バイトを受信して​​います。

さて、あなたは本当に2つの質問をしていると思います。

  1. TCP 接続を介して一度に 10 バイトを送信する方法 (使用しているsocket.SOCK_STREAM)
  2. Python ソケットを使用して raw バイトを送信するにはどうすればよいですか。

2 に答えましょう。最初に:バイト文字列に対してsocket.sendを呼び出す場合、TCP ペイロードとしてバイナリで送信する必要があります。

1. の場合、最も簡単な方法は、データをチャンクに分割することです (文字列を操作していることがわかったので、スライス操作を使用して簡単に行うことができます (文字列に関する Python チュートリアルを参照してください-s[0:10]などs[10:20])。 , これらのスライスが個別に送信されることを確認する必要があります. これは を呼び出すことで実行できますsocket.sendが, 問題は, TCP/IP スタックがそれらを望まなくてもこれらをパケットにグループ化する可能性があることです.ストリームソケットを提供しますsocket.SOCK_STREAM。ファイルに書き込みを行っていた場合、この場合に行うことは、ファイルをフラッシュすることですが、これは Python ソケットでは簡単ではないようです (この質問を参照してください)。

さて、その質問に対する答えは、不可能だというのは正しくないと思います。Scapyでは10 バイトの TCP チャンクを送信できるようです (chunks() 関数はhereから取得しました)。私はwiresharkでそれをチェックし、一貫した結果で何度も試しましたが、これが確実に起こることを確認するために実装をチェックしませんでした.

TCP が設計された目的を処理するのではなく、なぜデータを 10 バイトのチャンクで送信する必要があるのか​​を自問し、区切り文字の使用を検討する必要があります。

とにかく、Scapy を使用したコードは次のとおりです (楽しい事実: これを実行するのに root 権限は必要ないようです)。

クライアント:

from scapy.all import *

import socket
host = '192.168.0.x' #replace with your IP
my_port = 3002
message = "some string I want to send in chunks"

def chunks(lst, n):
    "Yield successive n-sized chunks from lst"
    for i in xrange(0, len(lst), n):
        yield lst[i:i+n]

client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect((host, my_port))
ss=StreamSocket(client_socket,Raw)
for chunk in chunks(message, 10):
    print "sending: " + chunk
    ss.send(Raw(chunk) )

client_socket.close()

サーバ:

import socket
my_port=3002
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(("", my_port))
server_socket.listen(5)
client_socket, address = server_socket.accept()
while (True):
    data = client_socket.recv(512)
    if (data):
        print data
    else:
        break
于 2012-11-22T23:30:09.540 に答える