服务端在 accept 到 client 之后,立即调用 close 方法与客户端的链接, 此时客户端 send 数据,理论上应该报错,但是在 Python 下不一定会报错, 而且可能报 BrokenPipeError: [Errno 32] Broken pipe, 极少数情况会报 ConnectionResetError: [Errno 104] Connection reset by peer.
求大神解释一下.
我是看书 HTTP 权威指南上说, "将数据传送到已经关闭的连接时会产生'连接被对传重置'错误', 特意动手实验一下.
1
petelin OP def server(port):
srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM) srv.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) srv.bind(("", port)) srv.listen(5) while True: print("等待链接...") client, addr = srv.accept() client.close() print('close') def client(port): client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) client.connect(('localhost', port)) print('try to send') r = client.send(b'sdffffffffffffffffffffffffffffff') r = client.send(b'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa') client.close() print('close...') |
2
petelin OP 大佬,都休息了吗?那我星期一在顶一下帖子。
|
3
wcsjtu 2017-11-02 23:07:48 +08:00
。。。。。。。竟然还没人回复
server 调用 close 后, 服务端的读写通道都关闭了, 这时候客户端再写入数据, 服务端会回复以 rst。 当一个进程向已经接收到 RST 的 socket 写数据时, 内核会向该进程发送 SIGPIPE 信号, 不论该进程是捕获了该信号, 还是忽略, 写操作都会返回 EPIPE。 lz 可以看看《 UNIX 网络编程卷 1 》 第五章 5.13 节, 里面的例子和你上面的代码类似 |