2016-12-28 6 views
2

私はpythonソケットで次々と3つのパケットを送信しようとしています。 Pythonはそれを1つまたは2つのパケットに最適化します。 私はそれをsleepコマンドで防止しましたが、時間がかかりすぎます。 TCP urgフラグをオンにすると思っていましたが、誰かがそれを行う方法を知っていますか?Pythonは送信時にパケットを最適化します。それを防ぐ方法は?

または別のソローションがありますか?

クライアント側:

import socket 
from time import sleep 

IP = '127.0.0.1' 
PORT = 5081 
BUFFER_SIZE = 1024 


s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.connect((IP, PORT)) 

s.send('1'*5) 
#sleep(1) 
s.send('2'*5) 
#sleep(1) 
s.send('3'*5) 

s.close() 

サーバ側:

import socket 

IP = '0.0.0.0' 
PORT = 5081 
BUFFER_SIZE = 1024 


s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.bind((IP, PORT)) 
s.listen(1) 

connection, address = s.accept() 
while 1: 
    #Here I expected to get the 1nd value 
    data1 = connection.recv(BUFFER_SIZE) 
    #end of communication 
    if not data1: 
     break 
    print 'data1', data1 

    #Here I expected to get the 2nd value,but both inputs arrived here, 22222 and 33333 
    data2 = connection.recv(BUFFER_SIZE) 
    print 'data2', data2 

    #Here I expected to get the 3nd value 
    data3 = connection.recv(BUFFER_SIZE) 
    print 'data3', data3 

connection.close() 

おかげ Avinoam

+0

なぜバッファサイズを1024に設定すると5バイトになるのですか? – thebjorn

+0

NAGLEアルゴリズムを無効にする: 's.setsockopt(socket.IPPROTO_TCP、socket.TCP_NODELAY、1)' –

+0

@thebjorn - 'recv'は最大のバッファサイズをとりますが、それはソケットの受信にあるすべてのものであれば、バッファ。それは1024バイトを待たない。 – tdelaney

答えて

4

あなたも試みるべきではありません。 TCPはストリームプロトコルであり、ストリームプロトコル(バイトの単一シーケンスを意味する)として使用する必要があります。 システムでローカルホストを使用するときにパケットの分離を維持することができたとしても、異なるホスト間で使用した場合、またはTCP/IPスタックのアップグレード後に破損する可能性があります。また、パケットがプロキシやソフトウェアフィルタを通過するとすぐに何かが起こる可能性があります。

別のオブジェクトをストリームに分離する正しい方法は、オブジェクト送信側をエンコードし、クライアント側を復号する上位プロトコルを使用することです。その例としては、サイズに続いて関連するバイトが1バイトまたは2バイト(1バイト以上の場合はネットワーク順)です。または、コマンド、ヘッダー、データを含むテキストプロトコルを想像することもできます。[ここに入力してください]

+0

スイッチはパケットを変更しません。ルータはIP層でTCPパケットを断片化するかもしれないが、IP断片がIP層(すなわち、TCP以下)のカーネルで再組み立てされるので、TCPパケットサイズの変更を引き起こさない。しかし、プロキシのようなものは、上位層で変更を引き起こし、パケットサイズを変更する可能性があります。また、MTU設定とPMTUがパケットサイズに影響する可能性があります。私はあなたに完全に同意します。つまり、TCPは決してメッセージプロトコルとして扱われるべきではなく、バイトストリームとしてのみ扱われるべきです。 –

+0

@SteffenUllrich:コメントいただきありがとうございます。私はそれで自分の投稿を編集しました... –

関連する問題