OCaml基于Janestreet Async的Tcp服务器仅监听本地如何配置为监听全地址
问题根因
你使用的Async版本默认开启了listen_on_localhost全局配置,该配置优先级高于of_port方法的默认监听逻辑,会强制所有端口绑定到127.0.0.1回环地址,因此即使of_port文档描述为监听所有地址,实际也只会监听本地请求。
解决方法
- 方法1:显式指定监听所有网卡(永久生效,不受全局配置影响,推荐)
替换原有Tcp.Where_to_listen.of_port 8886的写法,显式声明绑定到所有地址,修改后代码如下:
Tcp.Server.create ~on_handler_error:`Raise (Tcp.Where_to_listen.bind_to All_addresses (On_port 8886)) (fun _addr r w -> perform_tasks w r)
- 方法2:修改启动环境变量(临时测试用,无需修改代码)
启动服务前执行以下命令,覆盖默认的仅本地监听配置:
ASYNC_CONFIG='listen_on_localhost=false' ./你的服务可执行文件名
效果验证
服务启动后执行ss -tlnp | grep 8886命令查看监听状态,如果输出的监听地址为0.0.0.0:8886(IPv4所有地址)或:::8886(IPv6所有地址),即代表配置生效,外部网络可正常访问该服务端口。
内容的提问来源于stack exchange,提问作者Nadav
相关产品推荐
相关产品推荐

