You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python socket可发UDP但TCP报ConnectionRefused 111错误求助

问题原因
  • TCP协议使用逻辑错误:TCP是面向连接的传输协议,必须先和目标端完成三次握手建立连接后才能传输数据。你当前代码中直接对SOCK_STREAM类型的TCP套接字调用sendto()(无连接发送方法),完全不符合TCP的工作流程,这是核心代码错误。而UDP是无连接协议,不需要预先建立连接,所以可以直接调用sendto()发送数据,运行正常。
  • 目标端口无TCP服务监听:你的测试代码中TCP目标为127.0.0.1:23,23端口是telnet服务默认端口,现代操作系统默认不会开启该服务,该端口没有程序处于监听状态,即便代码逻辑正确也会返回connection refuse错误。
  • 测试目标不统一:你UDP测试的目标是10.4.0.136:443,TCP测试的是本地回环地址的23端口,两个测试目标完全不同,也可能存在跨主机TCP端口未开放、防火墙拦截的问题。
解决方法
  1. 修正TCP代码逻辑,新增连接建立步骤,正确的TCP发送代码示例如下:
import socket
from signal import signal, SIGPIPE, SIG_DFL 
signal(SIGPIPE, SIG_DFL) 

# 请修改为实际存在TCP服务的IP和端口
TCP_IP = "10.4.0.136"
TCP_PORT = 443
MESSAGE = "HELLO, I AM PC"

print("TCP TARGET IP : ", TCP_IP)
print("TCP TARGET PORT :", TCP_PORT)
print("MESSAGE:", MESSAGE)

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 先建立TCP连接
sock.connect((TCP_IP, TCP_PORT))
# 连接建立成功后再发送数据
sock.sendall(bytes(MESSAGE, encoding= "utf-8"))
# 用完关闭连接
sock.close()
  1. 提前确认目标端口的监听状态:
    • Linux系统可执行命令 ss -tulnp | grep [端口号] 查看端口是否处于LISTEN状态
    • Windows系统可执行命令 netstat -ano | findstr "[端口号]" 查看端口监听状态
  2. 确认目标主机的防火墙规则没有拦截对应TCP端口的入站连接请求,如果你是测试跨主机TCP通信,需要保证两端网络可达、端口开放。

内容的提问来源于stack exchange,提问作者seema kumawat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 05:36:06