autoflush在socket中做什么?我们为什么用它?

5 sockets perl autoflush

我正在研究一些套接字代码,无法弄清楚autoflush套接字上使用的原因.就是这样的

my $sock = IO::Socket::Unix(Peer => $socketfilename , Type => SOCK_STREAM)

autoflush $sock 1;
Run Code Online (Sandbox Code Playgroud)

还有一些地方

autoflush STDERR 1

autoflush STDOUT 1
Run Code Online (Sandbox Code Playgroud)

对于一般filehnadles.

它有什么作用?如果我不使用它会发生或将会发生什么?请举一些实际的例子,以便我理解而不是简单的定义.

adi*_*ere 8

数据通常不会立即在套接字上发送,它会被缓冲到某个点,然后一次性发送.

自动刷新意味着数据直接通过缓冲区然后刷新,而不是保留在缓冲区中等待其他数据到达和累积.

就如此容易.

没有自动刷新:

Tick | DATA sent|Socket Buffer| DATA received
.....|..........|.............|..............
1    | XX       | XX          | (nothing)
2    | yy       | yyXX        | (nothing)
3    | ZZZ      | ZZZyyXX     | (nothing)
4    | t        | (empty)     | tZZZyyXX
Run Code Online (Sandbox Code Playgroud)

使用自动刷新:

Tick | DATA sent | Socket Buffer | DATA received
.....|...........|...............|..............
1    | XX        | ()            | XX
2    | yy        | ()            | yy
3    | ZZZ       | ()            | ZZZ
4    | t         | ()            | t
Run Code Online (Sandbox Code Playgroud)
  • 套接字缓冲区大小:8个字符
  • 很简单的例子,你可能会在看到它之后提出一些其他问题 - 其中很大一部分也是依赖于实现的.此外,缓冲可以发生在各个级别(发送者,接收者,应用程序等).


ike*_*ami 6

它绝对没有...因为IO :: Socket :: Unix已经为你做了.

以块的形式发送数据的开销较少,因此文件库会累积数据以在缓冲区中打印,而不是立即发送到系统.只有当累积了4KB或8KB(取决于版本)数据时,才会将实际发送到系统的数据.这称为"缓冲".

将句柄的autoflush设置为true会禁用该句柄的缓冲.当您呼叫时print,数据将在print返回之前发送到系统.

看到不同:

$ perl -e'
   STDOUT->autoflush($ARGV[0]);
   for (0..9) { print $_ x 1024; sleep 1; }
' 1
<whole bunch of 1s>
<one second later: whole bunch of 2s>
<one second later: whole bunch of 3s>
<one second later: whole bunch of 4s>
<one second later: whole bunch of 5s>
<one second later: whole bunch of 6s>
<one second later: whole bunch of 7s>
<one second later: whole bunch of 8s>
<one second later: whole bunch of 9s>

$ perl -e'
   STDOUT->autoflush($ARGV[0]);
   for (0..9) { print $_ x 1024; sleep 1; }
' 0
# Before Perl 5.14:
<four seconds later: whole bunch of 0s, 1s, 2s and 3s>
<four seconds later: whole bunch of 4s, 5s, 6s and 7s>
<two seconds later: whole bunch of 8s and 9s>
# Perl 5.14+
<eight seconds later: whole bunch of 0s, 1s, 2s, 3s, 4s, 5s, 6s and 7s>
<two seconds later: whole bunch of 8s and 9s>
Run Code Online (Sandbox Code Playgroud)

autoflush由IO :: Socket ::*打开,因为套接字大部分时间都需要它.套接字通常用于交互式通信.请求,回复,请求,回复等.想象一下如果请求被卡在缓冲区中会发生什么......你将永远等待回复!