gpt4 book ai didi

sockets - ECONNRESET 在 AF_LOCAL 套接字的上下文中是什么意思?

转载 作者:行者123 更新时间:2023-12-03 10:07:08 24 4
gpt4 key购买 nike

我知道对于 TCP 套接字 ECONNRESET 与 RST 数据包有关。但是我在 read() 和 write() 调用上也看到了 AF_LOCAL 套接字的 ECONNRESET 错误。这是什么意思? ECONNRESET 与 read() 返回 0 或 write() 抛出 EPIPE 有何不同?

最佳答案

ECONNRESET 似乎意味着另一端关闭了连接,而没有读取已发送给它的未完成数据,并且可以在 read() 和 write() 上触发。但确切的行为取决于操作系统。

EPIPE

似乎是在对已关闭的套接字进行 write() 时触发,并且没有未完成的传出数据。适用于 PF_LOCAL 和 TCP 套接字。示例( ruby ):

a, b = UNIXSocket.pair
b.close
a.write("foo") # => EPIPE, on all OSes

读取()返回 0

当对方关闭连接并且没有未完成的传出数据时触发。适用于 PF_LOCAL 和 TCP 套接字。
a, b = UNIXSocket.pair
b.close
a.read # => 0 bytes, on all OSes

经济重置

在 Linux 上,它的行为是这样的:

当存在尚未写入另一端的未完成的传出数据时触发。 read() 为 PF_LOCAL 和 TCP 套接字触发它,但 write() 只为 TCP 套接字触发它; PF_LOCAL 套接字触发 EPIPE。

请参阅特定操作系统行为的示例。如果您知道其他操作系统的行为方式,请贡献。

示例 1:PF_LOCAL 套接字上的 read()
a, b = UNIXSocket.pair
a.write("hello")
b.close
a.read
# Linux: ECONNRESET
# OS X : returns 0 bytes

示例 2:TCP 套接字上的 read()
# Side A                                # Side B
s = TCPServer.new('127.0.0.1', 3001)
c = s.accept
c = TCPSocket.new('127.0.0.1', 3001)
c.write("hello")
c.close
c.read
# Linux: ECONNRESET
# OS X : returns 0 bytes

示例 3:PF_LOCAL 套接字上的 write()
a, b = UNIXSocket.pair
a.write("hello")
b.close
a.write("world")
# Linux: EPIPE and not ECONNRESET
# OS X : EPIPE and not ECONNRESET

示例 4:TCP 套接字上的 write()
# Side A                                # Side B
s = TCPServer.new('127.0.0.1', 3001)
c = s.accept
c = TCPSocket.new('127.0.0.1', 3001)
c.write("hello")
c.close
c.write("world")
# Linux: ECONNRESET
# OS X : no error

关于sockets - ECONNRESET 在 AF_LOCAL 套接字的上下文中是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2974021/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com