From 9af629b6f96465a0f7adc85f949bf58e33bc39de Mon Sep 17 00:00:00 2001 From: tsosunchia <59512455+tsosunchia@users.noreply.github.com> Date: Tue, 15 Apr 2025 13:36:42 +0800 Subject: [PATCH] =?UTF-8?q?ipgeo/leo.go=20=E4=BC=98=E5=8C=96=20receivePars?= =?UTF-8?q?e=20=E7=9A=84=E5=8D=95=E4=BE=8B=E8=B0=83=E7=94=A8(WebSocket=20?= =?UTF-8?q?=E8=BF=9E=E6=8E=A5=E7=9A=84=E5=B9=B6=E5=8F=91=E6=8E=A7=E5=88=B6?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ipgeo/leo.go | 10 +++++++++- trace/packet_listener.go | 5 +++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/ipgeo/leo.go b/ipgeo/leo.go index ba09ca2..c9e3d0b 100644 --- a/ipgeo/leo.go +++ b/ipgeo/leo.go @@ -83,6 +83,11 @@ func receiveParse() { } } +// 当前的实现中,每次调用 receiveParse() 都会锁定 WebSocket 连接 +// 当前为单例模式,只启动一个 receiveParse 协程 + +var receiveParseOnce sync.Once + func LeoIP(ip string, timeout time.Duration, lang string, maptrace bool) (*IPGeoData, error) { // TODO: 根据lang的值请求中文/英文API // TODO: 根据maptrace的值决定是否请求经纬度信息 @@ -100,7 +105,10 @@ func LeoIP(ip string, timeout time.Duration, lang string, maptrace bool) (*IPGeo // 发送请求 sendIPRequest(ip) // 同步开启监听 - go receiveParse() + // 确保 receiveParse 只启动一次 + receiveParseOnce.Do(func() { + go receiveParse() + }) // 拥塞,等待数据返回 select { diff --git a/trace/packet_listener.go b/trace/packet_listener.go index 6bc9184..f957b99 100644 --- a/trace/packet_listener.go +++ b/trace/packet_listener.go @@ -13,12 +13,17 @@ type ReceivedMessage struct { Err error } +// PacketListener 负责监听网络数据包并通过通道传递接收到的消息 type PacketListener struct { ctx context.Context Conn net.PacketConn Messages chan ReceivedMessage } +// NewPacketListener 创建一个新的数据包监听器 +// conn: 用于接收数据包的连接 +// ctx: 用于控制监听器生命周期的上下文 +// 返回初始化好的 PacketListener 实例 func NewPacketListener(conn net.PacketConn, ctx context.Context) *PacketListener { results := make(chan ReceivedMessage, 50)