确定远程设备端点 UDP Clojure CLR
Determine remote device endpoint UDP Clojure CLR
尝试在 Clojure CLR 中执行等效的 c# 代码
using System.Net;
IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
EndPoint remote = (EndPoint) sender;
recv = sock.ReceiveFrom(data, ref remote);
我在 Clojure 中尝试过但不起作用的方法:
(let [
sender (IPEndPoint. (IPAddress/Any) 0)
^EndPoint remote ^EndPoint sender
recv (.ReceiveFrom sock data (by-ref remote))
]
(println (.ToString remote))
;; Do something with data...
)
它只显示 0.0.0.0:0 我认为 ref 不工作但也不确定提示/转换语法。
我在此处查看了有关 ref https://github.com/richhickey/clojure-clr/wiki/CLR-Interop 的信息
这里关于指定类型:https://github.com/clojure/clojure-clr/wiki/Specifying-types
我翻译了问题评论中引用的MSDN文章。
(ns test.me
(:import [System.Net IPHostEntry Dns IPEndPoint EndPoint IPAddress]
[System.Net.Sockets Socket SocketType ProtocolType]))
(set! *warn-on-reflection* true)
(defn f []
(let [hostEntry (Dns/GetHostEntry (Dns/GetHostName))
endPoint (IPEndPoint. ^IPAddress (first (.AddressList hostEntry)) 11000)
sender (IPEndPoint. (IPAddress/IPv6Any) 0)
msg (byte-array 256)]
(with-open [s (Socket. (.AddressFamily (.Address endPoint))
SocketType/Dgram
ProtocolType/Udp)]
(.Bind s endPoint)
(.ReceiveFrom s msg (by-ref sender))
(println sender))))
运行 它产生:
>Clojure.Main.exe
Clojure 1.7.0-master-SNAPSHOT
user=> (load "/test/me")
nil
user=> (in-ns 'test.me)
#object[Namespace 0xaca85c "test.me"]
test.me=> (f)
#object[IPEndPoint 0x2126697 [fefe::3030:cfdf:f7f7:ecec%11]:55056]
nil
(已编辑 IP 地址)
您可能需要针对您的系统调整 IPAddress/IPv6Any
。
with-open
形式用于退出时自动关闭socket。
请注意,需要的类型提示很少(实际上是一个)。我已经打开反射警告——这是确定您是否需要更多提示的最佳方式。 (在这种情况下,如果没有 ^IPAddress
类型提示,加载会因错误而失败,因为它无法解析 IPEndPoint
构造函数。)
尝试在 Clojure CLR 中执行等效的 c# 代码
using System.Net;
IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
EndPoint remote = (EndPoint) sender;
recv = sock.ReceiveFrom(data, ref remote);
我在 Clojure 中尝试过但不起作用的方法:
(let [
sender (IPEndPoint. (IPAddress/Any) 0)
^EndPoint remote ^EndPoint sender
recv (.ReceiveFrom sock data (by-ref remote))
]
(println (.ToString remote))
;; Do something with data...
)
它只显示 0.0.0.0:0 我认为 ref 不工作但也不确定提示/转换语法。
我在此处查看了有关 ref https://github.com/richhickey/clojure-clr/wiki/CLR-Interop 的信息 这里关于指定类型:https://github.com/clojure/clojure-clr/wiki/Specifying-types
我翻译了问题评论中引用的MSDN文章。
(ns test.me
(:import [System.Net IPHostEntry Dns IPEndPoint EndPoint IPAddress]
[System.Net.Sockets Socket SocketType ProtocolType]))
(set! *warn-on-reflection* true)
(defn f []
(let [hostEntry (Dns/GetHostEntry (Dns/GetHostName))
endPoint (IPEndPoint. ^IPAddress (first (.AddressList hostEntry)) 11000)
sender (IPEndPoint. (IPAddress/IPv6Any) 0)
msg (byte-array 256)]
(with-open [s (Socket. (.AddressFamily (.Address endPoint))
SocketType/Dgram
ProtocolType/Udp)]
(.Bind s endPoint)
(.ReceiveFrom s msg (by-ref sender))
(println sender))))
运行 它产生:
>Clojure.Main.exe
Clojure 1.7.0-master-SNAPSHOT
user=> (load "/test/me")
nil
user=> (in-ns 'test.me)
#object[Namespace 0xaca85c "test.me"]
test.me=> (f)
#object[IPEndPoint 0x2126697 [fefe::3030:cfdf:f7f7:ecec%11]:55056]
nil
(已编辑 IP 地址)
您可能需要针对您的系统调整 IPAddress/IPv6Any
。
with-open
形式用于退出时自动关闭socket。
请注意,需要的类型提示很少(实际上是一个)。我已经打开反射警告——这是确定您是否需要更多提示的最佳方式。 (在这种情况下,如果没有 ^IPAddress
类型提示,加载会因错误而失败,因为它无法解析 IPEndPoint
构造函数。)