|
最近写一个脚本,其中有TCP连接的需求,典型的client/server的模式,其中发现一个问题:
假定此处的TCP连接已经建立,称为 $connection, 当收取数据包的时候,最初是采取 $connection -> recv( my $text, $length) 来读取内容的,(通过约定双方前4字节传送总的内容的length, 先解析收到的前四个字节, 得到$length的值),实际上就是说,这种处理方式是想要读取exactly $length bytes。
但是有人看完脚本,提了个问题, 说是使用recv($text, $length)时,表示可以接收的长度为1~$length,即使incoming的message长度达到$length bytes, 但偶尔还是会发生$text的长度不足实际长度的问题。
一种solution是使用sysread代替:
while ($bytes_to_read) {
$bytes_read = sysread ($socket, $bufrcv,$bytes_to_read, $offset);
$bytes_to_read -= $bytes_read;
$offset += $bytes_read;
}
查了查资料,没有找到发生这种问题的root cause, 据说与操作系统相关。还是有些无法很好的理解,先做个问题书签,留待以后补充。