为什么写入一个关闭的 TCP 套接字比读取一个更糟糕?

2024-01-15

当您读取关闭的 TCP 套接字时,您会收到一个常规错误,即它返回 0 表示 EOF 或 -1 以及错误代码errno可以打印perror http://www.opengroup.org/onlinepubs/000095399/functions/perror.html.

但是,当您编写一个关闭的 TCP 套接字时,操作系统会发送SIGPIPE到您的应用程序,如果没有被捕获,它将终止该应用程序。

为什么写入关闭的 TCP 套接字比读取它更糟糕?


+1 To 格雷格·休吉尔 https://stackoverflow.com/questions/2216374/why-is-writing-a-closed-tcp-socket-worse-than-reading-one/2216386#2216386引导我的思维过程朝着正确的方向寻找答案。

真正的原因是SIGPIPE套接字和管道中的过滤器习惯用法/模式适用于 Unix 系统中的典型 I/O。

从管道开始。像 grep 这样的过滤程序通常会写入STDOUT并从中读取STDIN,它可以被 shell 重定向到管道。例如:

cat someVeryBigFile | grep foo | doSomeThingErrorProne

shell 当它分叉然后执行这些程序时可能使用dup2 http://linux.die.net/man/2/dup2系统调用重定向STDIN, STDOUT and STDERR到适当的管道。

自过滤程序grep不知道也无法知道它的输出已被重定向,那么告诉它停止写入损坏的管道的唯一方法是:doSomeThingErrorProne崩溃是有信号的,因为写入的返回值STDOUT很少被检查过。

带插座的模拟将是inetd http://en.wikipedia.org/wiki/Inetd服务器取代了 shell。

作为一个例子,我假设你可以转grep进入一个网络服务,该服务运行于TCP插座。例如与inetd如果你想拥有一个grep服务器开启TCP端口 8000 然后将其添加到/etc/services:

grep     8000/tcp   # grep server

然后将其添加到/etc/inetd.conf:

grep  stream tcp nowait root /usr/bin/grep grep foo

Send SIGHUP to inetd并使用 telnet 连接到端口 8000。这应该会导致inetd要分叉,请将套接字复制到STDIN, STDOUT and STDERR然后执行grep以 foo 作为参数。如果您开始在 telnet 中输入行grep将回显那些包含 foo 的行。

现在用名为的程序替换 telnetticker例如,将实时股票报价流写入STDOUT并获取命令STDIN。有人远程登录到端口 8000 并输入“start java”以获取 Sun Microsystems 的报价。然后他们起床去吃午饭。 telnet 莫名其妙地崩溃了。如果没有SIGPIPE然后发送ticker会永远不断地发送报价,永远不知道另一端的进程已经崩溃,并且不必要地浪费系统资源。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么写入一个关闭的 TCP 套接字比读取一个更糟糕? 的相关文章

  • 线性模式匹配算法?

    我有一个由 0 和 1 组成的线性列表 我需要匹配多个简单模式并找到第一个出现的情况 例如 我可能需要找到0001101101 01010100100 OR 10100100010长度为 800 万的列表内 我只需要找到第一次出现的情况 然
  • 什么是 NOR 逻辑运算符?

    Is nor a 或 b a 或 b a 和 b 还有什么吗 a 或 b see http en wikipedia org wiki Logical NOR http en wikipedia org wiki Logical NOR了解
  • 用 C 语言进行非阻塞 udp 套接字编程:我能得到什么?

    我在理解从非阻塞 UDP 套接字返回什么recv recvfrom 时遇到问题 与 TCP 相比更具体一点 如果我错了 请纠正我 阻塞套接字 TCP 或 UDP 在缓冲区中有一些数据之前不会从 recv 返回 这可以是一定数量的字节 TCP
  • 与 Perl 和 Ruby 比较的相似语言特性 __END__

    背景 Perl 和 Ruby 有 END and DATA 允许将任意数据直接嵌入源代码文件中的标记 尽管这种做法可能不适合通用编程用途 但它对于例行任务的 一次性 快速脚本非常有用 问题 还有哪些其他编程语言支持相同或类似的功能 它们是如
  • 如何计算某物是否位于某人的视野中

    我有一个对象 它在 2D 空间中具有位置和速度 两者都由向量表示 对象的视野每侧均为 135 度 它看起来与移动的方向相同 速度矢量 我有一些对象 其在 2D 空间中的位置由向量表示 在图中 蓝色背景上的对象是可见的 红色背景上的对象对主体
  • Silverlight 套接字:模仿框架 Bind、Listen 和 Accept 方法?

    我有这个 NET Framework C 类 它实际上充当 TCP 连接的包装器Socket http msdn microsoft com en us library attbb8f5 aspxSystem Net Sockets 命名空
  • 为什么socket会干扰selenium?

    我编写了一个 python 脚本来使用套接字检查互联网连接 检查网络连接 https stackoverflow com questions 3764291 checking network connection 然后使用 selenium
  • Python - 将整数或字符串发送到 Spark-Streaming

    我可以通过 CSV 文件发送我的数据 首先 将我的随机数写入CSV文件然后发送 但是可以直接发送吗 我的套接字代码 import socket host localhost port 8080 s socket socket socket
  • net.Socket.writable、net.Socket.readable 属性不是官方 Node.js API 的一部分

    我想知道为什么 net Socket writable 和 net Socket read 属性不是官方 Node js API 的一部分 这是否意味着最好不要使用这些属性 因为它是将来可能会改变的内部内容 它们是 但不是你正在寻找的地方
  • 从套接字多次打开读/写流

    在我有的班级里ServerSocket监听传入连接 代码如下 while isRunning try Socket s mysocketserver accept acknowledgeClient s new ClientHandler
  • C# 套接字数据报溢出

    我是 C 新手 我有一个关于udp套接字的小问题 我有一个聊天服务器 它接收特定结构的数据包 udp 数据报 为什么程序在套接字缓冲区已满时才接收数据 难道以后的一切就不应该失去吗 也许会出现数据包碎片 数据包结构 udp headers
  • Ubuntu:无法通过套接字“/var/run/mysqld/mysqld.sock”连接到本地 MySQL 服务器 (2)

    我有 Ubuntu 14 04 安装了 LAMP 并运行 Owncloud 的服务器 我尝试安装文书工作 https github com twostairs paperwork wiki Installing Paperwork on U
  • Node.js Socket.IO 无法完全工作

    我运行一个侦听端口 5000 的独立服务器 当我通过 Netcat 或 Telnet 连接到它时 该应用程序不会在终端上打印任何内容 但在 Netcat Telnet 应用程序屏幕上 它显示连接已建立 var io require sock
  • 填充体积算法

    我有一个具有一定尺寸长度 宽度 高度的盒子 我有不同长度 宽度 高度的物品 是否有现有的算法可以确定放入盒子中的最佳物品 这称为装箱 切割库存 背包问题 并且是 NP 难问题 一般来说 您只能通过使用启发式方法获得近似解 请参见示例 htt
  • express.io VS express + socket.io 有什么用处?

    我在这里发现了 socket io 和聊天示例 https github com rauchg chat example blob master index js https github com rauchg chat example b
  • Chrome 在传输一定量的数据后挂起 - 等待可用的套接字

    我有一个浏览器游戏 最近我开始向游戏添加音频 Chrome 无法加载整个页面并卡在 91 requests 8 1 MB transferred 并且不再加载任何内容 它甚至破坏了所有其他选项卡中的网站 说Waiting for avail
  • 如何从任何进程关闭 Windows 上的套接字(ipv4 和 ipv6)连接?

    如何在 Windows 上关闭 tcp v4 和 tcp v6 连接 我不想终止具有开放连接的整个进程 因为这显然会将其他人踢出该进程 我需要从一个单独的进程执行此操作 因此无法访问套接字句柄等 我正在使用 Windows API 来获取
  • 无法通过套接字“/var/lib/mysql/mysql.sock”连接到本地 MySQL 服务器 (2)

    当我尝试连接 mysql 时出现以下错误 Can t connect to local MySQL server through socket var lib mysql mysql sock 2 这个错误有解决办法吗 其背后的原因可能是什
  • RTSP 设置后接收 RTP 数据包

    我正在尝试使用 Python 从 IP 摄像机流式传输 RTP 数据包 我能够使用 RTSP 协议发送描述 设置和播放命令 但是 我无法开始使用 RTP 传输实际视频流 这是代码 import socket def printrec rec
  • UDP SocketException - 通常只允许每个套接字地址使用一次

    尽管这里有很多非常相似的问题 但提供的答案都没有帮助我 这让我很难过 我有一个非常大的管理系统 我的任务是为其编写一些 UDP 数据包发送 接收 我已经编写了一个原型 一切都很好 所以我开始将我的代码合并到所述系统中 然而 我现在弹出了一个

随机推荐