Nguyên nhân gây ra lỗi này
Bạn đang chạy một script Python, REST client, hoặc bất kỳ công cụ nào dựa trên TCP, và gặp phải:
ConnectionRefusedError: [WinError 10061] No connection could be made because the target machine actively refused it
Đây không phải timeout. Windows đã gửi lại gói TCP RST ngay lập tức — nghĩa là có gì đó chủ động nói "không." Hoặc không có gì đang lắng nghe trên cổng đó, service bị crash, hoặc tường lửa đang chặn kết nối ở tầng ứng dụng.
Các tình huống thường gặp:
- Kết nối đến dev server local chưa được khởi động
- Ứng dụng trỏ đến
localhost:5432nhưng PostgreSQL chưa chạy - Kết nối Redis/RabbitMQ/Elasticsearch trong Docker khi container chưa sẵn sàng
- Kiểm tra Python
socketclient trước khi khởi động server - Kết nối đến service từ xa bị Windows Firewall chặn cổng
Bước 1 — Xác nhận những gì đang thực sự lắng nghe
Trước khi làm bất cứ điều gì, hãy kiểm tra xem có gì đang lắng nghe trên cổng đó không. Mở PowerShell hoặc Command Prompt và chạy:
# Kiểm tra xem có gì đang lắng nghe trên cổng 8080 không (thay bằng cổng của bạn)
netstat -ano | findstr :8080
# Hoặc liệt kê tất cả các cổng đang lắng nghe
netstat -ano | findstr LISTENING
Không có kết quả cho cổng của bạn? Không có gì đang lắng nghe — chỉ cần khởi động service là xong.
Để xác định process nào đang chiếm một cổng:
# Lấy PID từ kết quả netstat, rồi chạy:
tasklist /FI "PID eq 1234"
PowerShell cho kết quả tương tự nhưng rõ ràng hơn:
Get-NetTCPConnection -LocalPort 8080 -State Listen
Bước 2 — Khởi động service đích
Không có gì lắng nghe thì không có gì để kết nối. Hãy khởi động server:
# Python HTTP server
python -m http.server 8080
# Flask app
flask run --port 8080
# PostgreSQL (qua services)
net start postgresql-x64-15
# Redis (nếu đã cài đặt như một service)
net start Redis
# Hoặc qua panel Services
services.msc
Chạy lại lệnh ban đầu sau khi khởi động. Lỗi biến mất? Xong rồi.
Bước 3 — Kiểm tra Windows Firewall
Service đang chạy nhưng lỗi vẫn còn? Windows Firewall có thể là thủ phạm. Nó có thể chặn các cổng ở tầng ứng dụng — đặc biệt với kết nối inbound từ các máy khác hoặc Docker container.
Kiểm tra xem có rule nào tồn tại cho cổng của bạn không:
# Chạy PowerShell với quyền Administrator
Get-NetFirewallRule -Action Allow | Where-Object { $_.Enabled -eq 'True' } | Get-NetFirewallPortFilter | Where-Object { $_.LocalPort -eq '8080' }
Để thêm rule cho phép traffic inbound trên cổng 8080:
# PowerShell với quyền Administrator
New-NetFirewallRule -DisplayName "Allow port 8080" -Direction Inbound -Protocol TCP -LocalPort 8080 -Action Allow
Thích dùng giao diện đồ họa? Vào Windows Defender Firewall → Advanced Settings → Inbound Rules → New Rule → Port → TCP → 8080 → Allow.
Bước 4 — Sửa địa chỉ kết nối trong code
Một lỗi Python rất phổ biến: bind server với 127.0.0.1 nhưng kết nối từ process khác bằng địa chỉ khác (hoặc ngược lại).
# Phía server — chỉ bind với localhost
import socket
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(('127.0.0.1', 9000)) # Chỉ chấp nhận kết nối cục bộ
server.listen()
# Phía client — phải khớp chính xác
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(('127.0.0.1', 9000)) # OK
# client.connect(('0.0.0.0', 9000)) # SAI — WinError 10061
Bind với 0.0.0.0 chấp nhận kết nối trên tất cả các network interface. Bind với 127.0.0.1 giới hạn chỉ kết nối cục bộ. Client phải kết nối đến địa chỉ mà server đang thực sự lắng nghe — không phải địa chỉ nào tùy tiện.
Bước 5 — Xử lý race condition trong code
Khi ứng dụng khởi động một subprocess server và ngay lập tức cố kết nối, server có thể chưa sẵn sàng. Hãy thêm vòng lặp retry thay vì gọi connect() trực tiếp:
import socket
import time
def wait_for_port(host: str, port: int, timeout: float = 10.0):
start = time.time()
while True:
try:
with socket.create_connection((host, port), timeout=1):
return True # Kết nối thành công
except (ConnectionRefusedError, OSError):
if time.time() - start >= timeout:
raise TimeoutError(f"Port {port} not available after {timeout}s")
time.sleep(0.5)
wait_for_port('127.0.0.1', 8080)
# Bây giờ an toàn để thực hiện kết nối thực sự
Bước 6 — Kiểm tra antivirus và tường lửa bên thứ ba
Vẫn thấy WinError 10061 sau tất cả những bước trên? Phần mềm bảo mật bên thứ ba thường là thủ phạm ẩn. Windows Defender Antivirus, Kaspersky, Norton, Bitdefender — tất cả đều có lớp bảo vệ mạng có thể chặn truy cập cổng ngay cả khi các rule Windows Firewall đã được cấu hình hoàn hảo.
- Tạm thời tắt AV và kiểm tra kết nối
- Kiểm tra log bảo vệ mạng của AV để tìm kết nối bị chặn
- Thêm ứng dụng hoặc file thực thi Python vào danh sách ngoại lệ của AV
Xác minh đã sửa được lỗi
Dùng Test-NetConnection trong PowerShell — tương đương Windows của nc -zv:
# Kiểm tra kết nối đến localhost cổng 8080
Test-NetConnection -ComputerName localhost -Port 8080
# Kết quả khi thành công:
# TcpTestSucceeded : True
# Kết quả khi vẫn bị lỗi:
# TcpTestSucceeded : False
Hoặc kiểm tra trực tiếp trong Python:
import socket
try:
s = socket.create_connection(('127.0.0.1', 8080), timeout=3)
print('Connection OK')
s.close()
except ConnectionRefusedError:
print('Still refused — service not listening')
except TimeoutError:
print('Timeout — firewall may be dropping packets silently')
Mẹo thêm
Đang debug sự cố mạng liên quan đến dải IP, VPN, hoặc xung đột Docker subnet? Subnet Calculator trên ToolCraft giúp bạn nhanh chóng kiểm tra dải CIDR và xác định xem hai địa chỉ có cùng mạng không — hữu ích khi ứng dụng kết nối đến container qua bridge network mà bạn không chắc IP có thể đến được không. Chạy hoàn toàn trên trình duyệt, không tải dữ liệu lên.
Tóm tắt nhanh — Nguyên nhân WinError 10061
- Không có service nào đang lắng nghe → Khởi động server trước
- Sai số cổng → Kiểm tra config server so với config client
- Sai địa chỉ host → Địa chỉ bind phải khớp với địa chỉ kết nối
- Windows Firewall chặn → Thêm inbound rule cho cổng đó
- Service bị crash → Kiểm tra Event Viewer → Windows Logs → Application
- Race condition → Thêm vòng lặp retry trước khi kết nối
- Antivirus chặn → Kiểm tra log mạng của AV hoặc thêm ngoại lệ

