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端口未开放、防火墙拦截的问题。
解决方法
- 修正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()
- 提前确认目标端口的监听状态:
- Linux系统可执行命令
ss -tulnp | grep [端口号]查看端口是否处于LISTEN状态 - Windows系统可执行命令
netstat -ano | findstr "[端口号]"查看端口监听状态
- Linux系统可执行命令
- 确认目标主机的防火墙规则没有拦截对应TCP端口的入站连接请求,如果你是测试跨主机TCP通信,需要保证两端网络可达、端口开放。
内容的提问来源于stack exchange,提问作者seema kumawat
相关产品推荐
相关产品推荐

