2016-09-13 4 views
0

perl_server.plPython: Stellen Sie sicher, dass 1024 Byte zu einem Zeitpunkt

$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()) 

senden Wie gurantee i, so dass perl_server empfängt die Leitung zu einem Zeitpunkt (nicht verstümmelt) ?
Oder verhindern, dass die Leitung gepuffert wird, so dass sie nicht auf der Serverseite gedruckt wird, wenn keine andere Leitung eingeht?

ich glaube, wenn ich sicherstellen, dass die Größe des Artikels gesendet wird 1024, dann würde Perl Server eine Zeile auf einmal bekommen, richtig?

Wie kann ich sicherstellen, dass die Zeile 1024 Bytes gleichzeitig ist?

Was ist eine gute Strategie, wenn die Zeile länger als 1024 Bytes ist? (Nicht sicher, ob dies ein Fall geht es um besorgt zu sein)

normalerweise würde eine Linie irgendwo rund 50 Zeichen

+0

sendall bedeutet es für Sie, –

+0

@self sagen wir mal die Zeile 1524 Bytes hat, sendall() wird 1024 Bytes und 500 Bytes senden. Server kann 1024 Bytes lesen, aber es wird bei 500 Bytes blockiert, richtig? oder garantiert sendall 2x2424 Bytes zu senden? – ealeon

Antwort

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

ist ein Weg, man könnte es tun

eine andere Art und Weise (wenn '\x00' ist nicht Terminal char)

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

Ja, dieser Fall funktioniert, wenn die Zeile weniger als 1024 Bytes hat. ich denke, dass ich die Linie aufspalten muss, wenn die Linie mehr als 1024 Bytes ist und zwei 1024 Bytes sende. – ealeon

1

Vielleicht schreiten, Länge und Polsterung eine Kombination verwendet wird. max wird nicht benötigt, da Sie sicher sind, dass das Segment kleiner ist als Ihre Paketgröße.

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() 

Ausgang:

11111111111111111111111111111110 

11111111111111111111111111111111 

11111111111111111111111111111111 
10000000000000000000000000000000 
Verwandte Themen