简单的 UDP 服务器 OCaml/Async
Simple UDP server OCaml/Async
我正在尝试使用 OCaml 和 Async API 做一个简单的 UDP 服务器,但我被卡住了。我无法使这个简单的示例起作用。
let wait_for_datagram () : unit Deferred.t =
let port = 9999 in
let addr = Socket.Address.Inet.create Unix.Inet_addr.localhost ~port in
let%bind socket = Udp.bind addr in
let socket = Socket.fd socket in
let stop = never () in
let config = Udp.Config.create ~stop () in
let callback buf _ : unit = failwith "got a datagram" in
Udp.recvfrom_loop ~config socket callback
我测试它:
echo -n "hello goodbye" > /dev/udp/localhost/9999
我的程序没有任何反应。我尝试使用其他工具进行调查。
我看到一个带有 Wireshark 的 destination unreachable
数据包并且 lsof
向我展示了这个:
> lsof -i :9999
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
main.exe 77564 nemo 5u IPv4 0x25251bcc3485235f 0t0 UDP localhost:distinct
我做错了什么?
我觉得代码没问题。我认为 localhost
默认解析为 IPv6 地址,您只需将其发送到那里即可。
尝试强制使用 IPv4 协议
echo -n "hello goodbye" | nc -4 -u -w0 localhost 9999
或指定明确的 IPv4 地址
echo -n "hello goodbye" > /dev/udp/127.0.0.1/9999
我正在尝试使用 OCaml 和 Async API 做一个简单的 UDP 服务器,但我被卡住了。我无法使这个简单的示例起作用。
let wait_for_datagram () : unit Deferred.t =
let port = 9999 in
let addr = Socket.Address.Inet.create Unix.Inet_addr.localhost ~port in
let%bind socket = Udp.bind addr in
let socket = Socket.fd socket in
let stop = never () in
let config = Udp.Config.create ~stop () in
let callback buf _ : unit = failwith "got a datagram" in
Udp.recvfrom_loop ~config socket callback
我测试它:
echo -n "hello goodbye" > /dev/udp/localhost/9999
我的程序没有任何反应。我尝试使用其他工具进行调查。
我看到一个带有 Wireshark 的 destination unreachable
数据包并且 lsof
向我展示了这个:
> lsof -i :9999
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
main.exe 77564 nemo 5u IPv4 0x25251bcc3485235f 0t0 UDP localhost:distinct
我做错了什么?
我觉得代码没问题。我认为 localhost
默认解析为 IPv6 地址,您只需将其发送到那里即可。
尝试强制使用 IPv4 协议
echo -n "hello goodbye" | nc -4 -u -w0 localhost 9999
或指定明确的 IPv4 地址
echo -n "hello goodbye" > /dev/udp/127.0.0.1/9999