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

Python DTLS服务器无法接收连接问题求助

DTLS连接失败问题排查与修复

核心问题出在服务器代码误用了TCP专属的Socket API——listen()和accept()是为有连接的TCP设计的,DTLS基于无连接的UDP协议,完全不支持这些操作,这就是服务器无法响应Client Hello的根本原因。

具体修复点

  • 移除服务器端的sock.listen(2)和sock.accept()调用,改用UDP/DTLS适配的recvfrom()触发握手并接收数据
  • 修正证书路径的转义问题:Windows下路径中的\要写成\\,或者用原始字符串(r''包裹),避免被解析为转义字符
  • 客户端代码中证书路径存在笔误:'\cert.pem'应改为'.\cert.pem'(或修正后的路径格式)

修改后的客户端代码

import socket
import ssl
from dtls import do_patch
do_patch()

# 替换为实际服务器IP
serverAddress, serverPort = "192.168.1.158", 12345
addr = (serverAddress, serverPort)

s = socket.socket(socket.AF_INET, SOCK_DGRAM)
# 用原始字符串避免路径转义问题
SSLSocket = ssl.wrap_socket(s, r'.\key.pem', r'.\cert.pem', server_side=False)

SSLSocket.connect(addr)
clientMessage = b'I am the UDP client'
SSLSocket.send(clientMessage)
print("消息已发送,等待响应")
# 可选:接收服务器响应
response = SSLSocket.recv(1024)
print(f"收到服务器响应: {response.decode('utf-8')}")

修改后的服务器代码

import ssl
from socket import socket, AF_INET, SOCK_DGRAM
from dtls import do_patch
do_patch()

serverAddress, serverPort = "192.168.1.158", 12345
addr = (serverAddress, serverPort)

s = socket(AF_INET, SOCK_DGRAM)
# 用原始字符串避免路径转义问题
sock = ssl.wrap_socket(s, r'.\key.pem', r'.\cert.pem', server_side=True)
sock.bind(addr)
print("DTLS服务器已启动,等待客户端连接...")

# 用recvfrom触发DTLS握手,接收客户端数据
data, client_addr = sock.recvfrom(1024)
print(f"收到来自 {client_addr} 的消息: {data.decode('utf-8')}")
# 可选:发送响应给客户端
sock.sendto(b'Hello from DTLS server', client_addr)

额外说明

DTLS的握手流程依赖UDP数据包的交互,服务器通过首次recvfrom()接收到客户端的Client Hello后,会自动完成握手过程,之后就可以像普通UDP Socket一样收发加密数据了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 20:40:12