.net 确定远程设备终结点UDP Clojure CLR
试图在Clojure CLR中执行等效的c#代码.net 确定远程设备终结点UDP Clojure CLR,.net,clojure,udp,ref,clojureclr,.net,Clojure,Udp,Ref,Clojureclr,试图在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)
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不起作用,但也不确定hint/cast语法
我在这里查看了ref的信息
关于指定类型:我翻译了关于这个问题的评论中引用的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
打开的窗体用于在退出时自动关闭插座
注意,很少需要类型提示(实际上是一个)。我打开了反射警告——这是确定是否需要更多提示的最佳方法。(在这种情况下,如果没有^IPAddress
类型提示,加载将失败并出现错误,因为它无法解析IPEndPoint
构造函数。)-什么是sock和recv?-您确定需要类型提示吗?-你确定你的C#示例在相同的网络条件下工作吗?关于我试图转换为Clojureclr的C#代码,它来自一个用于确定发件人id的Microsoft示例。你真的尝试过吗?是的,我尝试过C#代码,它按预期工作。我能够通过远程端点对象上的ToString方法提取发送者的IP地址和端口号。