python sendall 未引发连接关闭错误

2023-12-07

我有以下代码,在 linux / mac 、远程和本地计算机上使用 python2.7 和 python3.5 进行了测试:

import socket
import time

s = socket.socket()
s.connect(("127.0.0.1", 8080))
s.sendall(b'first')
time.sleep(20)
s.sendall(b'should fail')

在另一边我有一个“服务器”正在运行netcat -l -p8080

我一看到first,我杀死 netcat 命令

但是,那s.sendall不会引发任何异常,为什么会这样?

编辑:注意做s.sendall再一次然后引发异常

import socket
import time

s = socket.socket()
s.connect(("127.0.0.1", 8080))
s.sendall(b'first')
time.sleep(20)
s.sendall(b'should fail')
s.sendall(b'now it really fails')

因为你的 python 代码所代表的客户端还不知道服务器的套接字已关闭并消失。将 TCP 连接视为两个独立的通道:每个方向一个。 TCP 协议允许每一方在自己选择的时间关闭连接的发送方。并且 TCP 无法向对方表明未来向另一个方向发送的数据将不被接受。

更详细地说... TCP 会话的普通终止涉及each端发送数据包FIN标志设置。这表明对等方发送FIN不会再发送任何数据。确实如此not表明接收者FIN数据包可能不再发送任何数据。

所以,这里发生的事情是,当你杀了netcat, a FIN数据包从服务器端发送到客户端(并由网络堆栈代表客户端确认)。这会关闭套接字的服务器=>客户端方向。然而,就客户端所知,client=>server 方向仍然可用。稍后,当您的客户端尝试发送数据时,将发送包含该数据的数据包。现在,服务器端的网络堆栈立即响应,通过发送一个消息来告诉客户端服务器不再存在。RST包。然而,你的sendall函数调用在收到时早已完成。

因此,如果您的客户再睡一秒钟(或者实际上只是一小部分秒),然后尝试another发送,后续发送would引发异常。

创建整个会话的数据包捕获并使用wireshark对其进行研究可能会很有启发。在调用 python 代码之前在另一个窗口中运行此命令(然后使用 Ctrl-C 终止):

sudo tcpdump -i lo -w /tmp/f.pcap port 8080

也可以使用wireshark来捕获,指定相同的port 8080作为捕获过滤器——或者tcp.port == 8080作为显示过滤器。

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

python sendall 未引发连接关闭错误 的相关文章

随机推荐

  • 如何在 python 中同时检测多个按键?

    我想对角移动我的机器人汽车 因此为了实现这一点 我想检测 w 是否与 d 或 a 一起按下 如果我想使用 w a s d 作为我的键 我现在有的是这样的 from curtsies import Input with Input keyna
  • 不同签名功能的容器

    我正在尝试用 C 编写一个框架 用户可以在其程序中指示他想要应用的一组函数记忆化战略 假设我们的程序中有 5 个函数f1 f5我们希望避免对函数进行 昂贵的 重新计算f1 and f3如果我们已经使用相同的输入调用它们 请注意 每个函数可以
  • 如何动态加载 gwt 生成的 nocache.js 文件?

    我想加载生成的 GWTfoo foo nocache js使用 JQuery 动态文件 不知何故这个foo foo nocache js文件不被浏览器执行 如果我通常使用 GWT 样式而不使用 JQuery 放置脚本 那么在加载页面后 它会
  • 标准布尔运算顺序

    我正在用 JavaScript 编写一个用于布尔逻辑的调车场算法 但我遇到了操作顺序的问题 我允许的操作是 and or implies equals biconditional not xor nor nand 但是 我不知道这些的优先顺
  • BasicNetwork.performRequest - 意外响应代码 400 (POST)

    当我尝试使用 Volley StringRequest 或 JsonObjectRequest 通过 REST API 获取数据时 我总是收到 400 错误 它与邮递员一起工作正常 Http请求方法为POST Content Type为ap
  • 在 GZIPInputStream 中包装 BodySubscriber 会导致挂起

    我正在使用新的java net http类来处理异步 HTTP 请求 响应交换 我正在尝试找到一种方法让 BodySubscriber 处理不同的编码类型 例如 gzip 然而 映射一个BodySubsriber
  • 在 C 中对齐 printf() 变量和小数

    今天C的大问题 所以我希望我的变量在列中对齐并且同时保留两位小数 我知道要达到小数点后两位 我需要使用 2f 如果我想要宽度 我使用 30s 但我无法将它们结合起来 看看我下面的代码你就会明白了 printf ItemA 2f 3 34 2
  • 宽松的内存顺序效果是否可以延长到执行线程的生命周期之后?

    假设在 C 11 程序中 我们有一个名为A启动一个名为的异步线程B 内螺纹B 我们对原子变量执行原子存储std memory order relaxed记忆顺序 然后穿线A用线程连接B 然后穿线A启动另一个名为C执行原子加载操作std me
  • 让调用堆栈向上增长会使缓冲区溢出更安全吗?

    每个线程都有自己的堆栈来存储局部变量 但堆栈也用于存储返回地址调用函数时 在 x86 汇编中 esp指向最近分配的堆栈末尾 如今 大多数 CPU 的堆栈都出现负增长 此行为可以通过溢出缓冲区并覆盖保存的返回地址来执行任意代码 如果堆栈正向增
  • 如何设置ImageView透明

    我的图像设置为 50 透明 当我把它放到ImageView上时 它完全不透明 看不到后面的东西 如何在xml中为ImageView设置100 透明 以便当我设置图像时 我可以看到后面的东西 我试过 android opacity trans
  • 表格行上的框阴影未出现在某些浏览器上

    表格行上的 CSS 框阴影 tr 跨浏览器的工作似乎不一致 在某些浏览器上会显示阴影 在其他人身上 没有影子 我正在使用以下 CSS tr background color rgb 165 182 229 box shadow 0px 2p
  • 如何取消设置 JavaScript 变量?

    我在 JavaScript 中有一个全局变量 实际上是一个window属性 但我认为这并不重要 它已经由以前的脚本填充 但我不希望稍后运行另一个脚本来查看它的值 或者甚至定义它 我已经把some var undefined它用于测试目的ty
  • Excel VBA 对于带有数据验证列表的每个循环

    我有 4 个数据验证下拉列表 我想使用 for every 循环来迭代 4 个数据验证下拉列表的所有可能值 并将结果复制到工作表中 下拉菜单位于单元格 H3 和 H4 以及 U3 和 U4 中 H3 和 U3 包含相同的值 H4 和 U4
  • 字符编码 - RequestDispatcher

    我有一个 servlet 我使用 String error error request setAttribute loginError error request setCharacterEncoding UTF 8 request get
  • 如何导出 Spearman 相关性

    我正在尝试将 Spearman 相关矩阵导出到rtf或 Excel 文件使用estpost和社区贡献的命令esttab 但是 我收到以下错误 invalid subcommand r 198 下面是我的代码 estpost spearman
  • ASIO 直接从异步解析获取 tcp 端点

    我正在寻找使用 ASIO 独立库 不是 Boost ASIO 我正在尝试设置客户端以连接到特定端口上的服务器 我看到在波特漏斗例如 无需处理迭代器即可获取端点 asio io service io service Determine the
  • Xcode:为什么“用户交互已启用”出现两次?

    这个问题适用于 Xcode 3 和 4 为什么这个复选框出现两次 在身份检查器和属性检查器下 更重要的是 为什么改变一个值不会影响另一个值呢 身份检查器中启用的用户交互指的是可访问性协议 这是一个链接无障碍编程指南您可以勾选不同的特征来修改
  • jquery新手:将验证与隐藏提交按钮结合起来

    我是 jQuery 新人 我已经验证可以使用我的表单 MVC 1 0 C
  • 如何在VBA中对变量范围内的值求和?

    我有一张表格 如下所示 在 C 列中 如果 A 列具有相同的索引 B 列 我想对 A 列中的值求和 如果所有行具有相同的索引 如 D 列所示 我想对所有行输入总和结果 不幸的是 具有相同索引的值的范围是可变的 我的宏可以仅使用 2 个索引对
  • python sendall 未引发连接关闭错误

    我有以下代码 在 linux mac 远程和本地计算机上使用 python2 7 和 python3 5 进行了测试 import socket import time s socket socket s connect 127 0 0 1