perl - autoflush 在 socket 中有什么作用?我们为什么用它?

标签 perl sockets autoflush

我正在处理一些套接字代码,但无法弄清楚为什么会出现 autoflush用在 socket 上。它是这样的

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

autoflush $sock 1;

还有一些地方
autoflush STDERR 1

autoflush STDOUT 1

用于一般文件处理。

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

最佳答案

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

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

就如此容易。

没有自动冲洗:

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

带自动冲洗:
Tick | DATA sent | Socket Buffer | DATA received
.....|...........|...............|..............
1    | XX        | ()            | XX
2    | yy        | ()            | yy
3    | ZZZ       | ()            | ZZZ
4    | t         | ()            | t
  • 套接字缓冲区大小:8 个字符
  • 很简单的例子,你看到之后可能会提出一些其他的问题——其中很大一部分也是依赖于实现的。此外,缓冲可能发生在各个级别(发送方、接收方、应用程序等)
  • 关于perl - autoflush 在 socket 中有什么作用?我们为什么用它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15023957/

    相关文章:

    perl - 如何使用 perl v5.6.1 安装 SpreadSheet::ParseExcel

    我可以在linux中查看tcp套接字缓冲区的数据来检查数据是否是我想要的

    ruby - 如何在 Ruby 中为 clamd 实现 INSTREAM 协议(protocol)?

    Django 测试数据库不自动刷新

    hibernate - 为什么Grails可搜索插件在Hibernate AutoFlush上导致错误?

    html - 如何用对 sql 数据库内容的查询替换 perl 中的数组?

    perl - 为什么在 Perl 中 system() 的结果不是我脚本的确切退出代码?

    Java:如何配置 System.out 以启用自动刷新?

    Perl 嵌套散列散列

    C - epoll 无限期地报告 EPOLLIN 为 1-way closed socket