perl_server.pl
$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())
我如何保证perl_server一次收到一行(没有损坏)? 或者阻止线路被缓冲,这样它就不会在服务器端打印,除非另一条线路进入?
我相信如果我确定发送的项目的大小是1024,那么perl服务器一次会得到一行,对吗?
如何确保一行是1024字节?
如果线路长度超过1024字节,那么策略是什么? (不确定这是否是一个需要关注的案例)
通常,一行约为50个字符答案 0 :(得分:3)
PACKET_SIZE = 1024
line = random_line()
sock.send(line+"\x00"*max(PACKET_SIZE-len(line),0))
是你可以做到的一种方式
另一种方式(如果'\x00'
不您的终端字符
'{val:{terminal}<{size}}'.format(val=line,size=PACKET_SIZE,terminal='\xff')
答案 1 :(得分: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