【问题标题】:Python TCP Sockets Not Working ProperlyPython TCP 套接字无法正常工作
【发布时间】:2015-10-12 16:24:38
【问题描述】:

不久前我问了this 的问题。我很惊讶没有人提出任何答案,所以我很确定我的问题相当罕见。昨天,当我在自我诊断这个问题时,我开始把这些点联系起来。我的 Twisted TCP 服务器无法工作,IDLE 由于“套接字错误”而在启动时失败并返回消息:“IDLE 子进程:套接字错误:无法建立连接,因为目标机器主动拒绝了它”,我得到了这个当我尝试运行连接到(本地)TCP 服务器的(本地)TCP 客户端时出现同样的错误。

所以我昨天得出结论,这些不仅仅是个别问题,而是使用 Python 套接字创建和运行 TCP 端点的更大问题。请记住,我在本地网络上运行并在本地工作的 UDP 服务器和客户端,所以我认为这不是整个 Socket 模块的问题,而只是 TCP 方面的问题。

我电脑上的一些信息:Windows 64 位,运行 Python 2.7.9(出于某种原因,32 位),笔记本电脑通过(内置)无线网卡连接到网络。 ISP 是 Comcast(如果它有所作为),Router/Modem(它是一体式的)是 Comcast 提供的 TechniColor(同样,如果它有所作为的话)。

我尝试过的事情:

  • 重置我的 .../etc/hosts 文件
  • 2 个月前重新安装了 Python(尝试排除故障时)
  • 关闭所有防火墙(我只有 1 个)
  • 没有除 Microsoft Security Essentials 之外的防病毒软件
  • 当我仍然安装 Bitdefender 时问题仍然存在,但我安装它是为了确定

我还在前面提到的上一个线程中查看了small troubleshooting session。我在使用 TCP 套接字时遇到的最大错误是: socket.error: [Errno 10061] No connection could be made because the target machine actively refused it.

那么,有人知道这里出了什么问题吗?谢谢。

编辑: 看起来我错过了一些东西,端口是 45002,超出了默认 Windows 端口的范围,我很确定没有使用它,因为我已经能够运行该端口上的 UDP 服务器,结果良好。该端口也是端口转发的,以防万一。

【问题讨论】:

  • 防火墙是否有可能阻止它?
  • 你在哪个端口打开套接字?是否有其他东西已经在使用该端口?
  • @ThomasOwens 对不起,我知道我错过了什么,端口是 45002,超出了默认 Windows 端口的范围,我很确定没有人使用它,因为我已经能够运行该端口上的 UDP 服务器,结果良好。该端口也是端口转发的,以防万一。我会确保将此信息添加到 OP。谢谢。
  • @MeghdeepRay 我很确定防火墙不是问题。我尝试关闭防火墙并返回相同的错误。不知道 UDP 通信是否需要防火墙权限,但如果需要,它将进一步证明我的观点,因为我已经成功地在本地运行了 UDP 服务器/客户端。
  • 另外,你是在客户端之前启动服务器吗?服务器是否设置为在客户端开始传输到该端口之前接受到端口 45002 的传入连接?

标签: python sockets networking tcp network-programming


【解决方案1】:

您收到错误“无法建立连接,因为目标计算机主动拒绝它”的事实。表示没有人在您尝试连接的端口上侦听。每次有人尝试连接到没有人在监听的端口时,TCP 内核都会以 RST 响应,在该 IP@ 上,因此您实际上是在到达主机,但主机没有在端口上提供任何服务。

你有没有忘记启动你的服务器?在您尝试连接的服务器机器上运行 netstat -a 以显示它实际上正在侦听的端口列表。

【讨论】:

  • 不,有一个服务器正在监听该端口。还是连接不上。另外,请记住,问题不仅在于我自己的套接字,而且 Twisted 和 IDLE 都无法连接 TCP 套接字并返回相同的错误。
  • 尝试不同的机器。
  • 会尽快做的。
  • 刚刚在另一台笔记本电脑上尝试过。虽然它不起作用,但它并没有给我同样的错误,它在另一台笔记本电脑上给我的错误是关于服务器无法连接到客户端,但在这台笔记本电脑上,发生了相反的情况,服务器甚至没有注意到连接,客户端只是返回我在我的 OP 中提到的错误。
  • 首先在同一台机器上尝试所有的环回。
【解决方案2】:

这种类型的错误通常发生在初始 TCP SYN 被回复 RST(重置)时。除非您的操作系统、socket 或 Twisted 出现严重问题,否则该消息一定是在网络上发生的 - 一定是有人发送了它,而这就是罪魁祸首! :)

我的建议是在您的计算机上运行 wireshark 以找出 RST 的来源。

如果它来自网络内外的其他设备,您必须调查该设备。

如果它来自您的计算机,并且您确实有一个套接字在该地址上侦听,那么责任在于您的操作系统(或某些干预它的程序,例如防火墙、防病毒软件或病毒)。

如果没有 RST 消息,则说明您的应用程序(或 Twisted、python 或您的操作系统)有问题,您必须调查导致引发异常的原因(检查您的堆栈跟踪)。

【讨论】:

  • 您有什么方法可以指导我完成这些步骤吗?我从未使用过 Wireshark,而且我对整个网络还很陌生,所以我现在很迷茫。感谢您的意见。
  • @Scoutdrago3 以这种格式执行它有点复杂,但是wireshark 有很好的文档。我的建议是download it 并安装它(只需仔细执行所有安装步骤,包括 pcap ),然后查看用户指南的Capturing live data section,这应该足以完成此任务。确保filtertcp,以使事情变得更容易
  • 嘿,我得到了一些 3 分钟的 TCP 过滤捕获,其中我启动了 TCP 连接和空闲。现在,我如何找到不工作的特定程序(pythonw.exe 和 IDLE)正在生成的那些?
  • @Scoutdrago3 理想情况下,在捕获(关闭浏览器和其他可能访问网络的进程)时尽量减少网络流量,这样更容易。不能按特定程序过滤,但可以用tcp.port==X按端口过滤
  • 所以我发现了一个问题。我发现我可以按端口过滤,所以我继续这样做,显然 IDLE 和我的 Python 服务器/客户端都没有发送或接收任何数据包。我过滤到 TCP 端口 45002 并开始运行我的服务器,没有数据包。所以然后我运行了我的客户。客户端失败,在 OP 中返回上述错误,奇怪的是,仍然没有接收或发送数据包。于是我过滤到 8833(应该是 Python 的 IDLE 的子进程的端口),启动 IDLE,IDLE 崩溃,什么都没有。没有数据包。有什么想法吗?什么会在数据包被发送之前阻止它们?
【解决方案3】:

我无法阅读完整的帖子。根据我在许多项目中为 TCP 服务器和客户端实现 Python 的知识,我可以给你一些提示。

  1. 您必须在服务器和客户端设备上的防火墙上启用 TCP 入站规则
  2. 需要正确的服务器IP地址才能绑定服务器中的socket连接

【讨论】:

    猜你喜欢
    • 2012-01-26
    • 2018-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-13
    • 2011-02-25
    • 2017-06-24
    • 2022-01-13
    相关资源
    最近更新 更多