2016-09-13 2 views
0

perl_server.plPythonの:私は島嶼地区などにはどうすればよい

$client_socket = $socket->accept(); 

if (defined $client_socket) { 
    $client_socket->autoflush(1); 
    $client_socket->setsockopt(SOL_SOCKET, SO_RCVTIMEO, pack('l!l!', 30, 0)) or die "setsockopt: $!"; 
} 

    while (1) { 
     my $line = ""; 
     $client_socket->recv($line, 1024); 
     print "$line\n"; 
} 

python_client.py

def random_line(): 
    return "random len of line here" 

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
server_address = (brock_host, int(brock_port)) 
sock.connect(server_address) 
while True: 
    sock.sendall(random_line()) 

時点で1024のバイトを送信してくださいが、そのためperl_serverは一度にラインを受信する(マングルされません) ?
それとも別のラインが入って来ない限り、それはサーバ側で印刷していないですので、バッファリングされることから行を防ぎますか?

私が送信された項目のサイズが1024であることを確認した場合、その後、perlのサーバが正しい時間、でラインになるだろうと考えていますか?

にはどうすればいいのラインが一度に1024バイトの場合は確認していますか?

いただきました!良い戦略行が1024バイトを超える場合は? (これは心配するケースであるかどうかわからない)

通常、行は50文字

+0

sendallはあなたのためにそれをしない、 –

+0

が)のは、行が1524バイト、sendallを(持っているとしましょう@self 1024バイトと500のバイトを送信します。サーバーは1024バイトを正常に読み取ることができますが、500バイトでブロックされますが、正しいですか? 2x 1024バイトを送信するsendall保証はありますか?行未満1024バイトを持っている場合 – ealeon

答えて

3
PACKET_SIZE = 1024 
line = random_line() 
sock.send(line+"\x00"*max(PACKET_SIZE-len(line),0)) 

の周りのどこかだろうことは'\x00'場合は

に別の道を(それを行う可能性が一つの方法でありますないあなたの端末のchar)である

'{val:{terminal}<{size}}'.format(val=line,size=PACKET_SIZE,terminal='\xff') 
+1

はい、この場合は動作します。ラインが1024バイト以上で、2つの1024バイトを送るなら、私はラインを分割する必要があると思う。 – ealeon

1

たぶんストライド、長さ、およびパディングを使用しての組み合わせ。スライスがパケットサイズより小さいと確信しているので、maxは必要ありません。

M = 32 

for length in (M - 1, M, M + 1): 

    payload = '1' * length 

    for i in range(0, len(payload), M): 

     packet = payload[i : i + M] 

     packet += '0' * (M - len(packet)) 

     print(packet) 

print() 

出力:

11111111111111111111111111111110 

11111111111111111111111111111111 

11111111111111111111111111111111 
10000000000000000000000000000000 
関連する問題