【问题标题】:How to inject a "Broken pipe" error?如何注入“断管”错误?
【发布时间】:2013-08-23 17:54:42
【问题描述】:

我正在对使用 TCP 套接字的网络程序进行测试。为了验证错误修复,我需要在套接字层重现“Broken pipe”错误,但我不知道如何。任何想法?非常感谢。

【问题讨论】:

    标签: sockets networking tcp


    【解决方案1】:

    'Broken pipe' 意味着你已经写入了一个已经被对端关闭的连接。因此,让对等方关闭连接。

    【讨论】:

    • 理论上是的。在我的代码中,我尝试通过 close()、exit() 甚至“ctrl-C”退出接收器。没有什么会让发件人打印“Broken pipe”错误。
    • 再发一些。没有人说它会是瞬间的。它不会发生在中断后的第一次发送中,例如,因为 TCP 缓冲。此外,发件人不一定会打印任何内容,除非它被编程为在每个 send() 错误时都这样做。
    • 是的,我发送了大量数据并降低了网络速度,在传输过程中杀死了接收者。谢谢。
    【解决方案2】:

    “Broken pipe”错误消息通常来自 shell,当它检测到它创建的子进程由于 SIGPIPE 信号而退出时。因此,您可以通过使用 SIGPIPE(kill -PIPE %1 杀死第一个后台命令)来手动杀死一个孩子。

    SIGPIPE 由内核生成,并在另一端关闭后发送给任何尝试写入管道或套接字的进程。

    【讨论】:

    • 我有代码检查“send()”的返回值,并使用“perror()”打印错误。如果是真正的“断管”,perror 会打印出来。但是对于您的方法,程序会退出而不会打印任何错误。
    • 那么你在某处缺少测试,或者程序已经发送了大部分数据。
    【解决方案3】:

    我环顾四周,在任何地方都找不到记录的程序,所以你去吧。

    我在我的 ssh 配置中发现了一个使用“nc”代理命令的服务器。

    主机服务器

    代理命令 /usr/bin/nc -4 -n -X 5 -x 127.0.0.1:55555 %h %p

    我在 ServerAlive 选项设置为 1 的情况下运行 ssh:

    > ssh -o ServerAliveInterval=1 -o ServerAliveCountMax=1 e3prosup@server

    然后在另一个会话中,我找到了与 ssh 关联的“nc”进程并将其杀死。 kill -9 (SIGKILL) 或 kill -13 (SIGPIPE) 都可以。

    > ps -efa

    e3prosup 19502 10955 0 11:43 pts/6 00:00:00 ssh -o ServerAliveInterval=1 -o ServerAliveCountMax=1 e3prosup@server

    e3prosup 19503 19502 0 11:43 pts/6 00:00:00 /usr/bin/nc -4 -n -X 5 -x 127.0.0.1:55555 服务器 22

    > 杀死 -13 19503

    现在 ssh 会话得到:

    e3prosup@server> 写入失败:管道损坏

    【讨论】:

    • 问题中没有提到ssh
    猜你喜欢
    • 2011-03-29
    • 1970-01-01
    • 2017-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-14
    • 2016-01-11
    相关资源
    最近更新 更多