这是我发送到ZeroMQ邮件列表的帖子的副本.然而,问题是它不是特定于ZeroMQ,而是更普遍的关于在WinRT中提供的网络功能的"映射"层的需要,以便在针对WinRT编译时为C++代码提供更正常的"Berkeley Socket facade":
大家好,我之前在移动应用程序中使用过ZeroMQ(请参阅http://www.ibuzzedfirst.com),对于iPhone和Android版本,因为这些平台支持本机/ C++/Socket开发,因此支持ZeroMQ.
对于WindowsPhone 7.5(OS 7.1)版本,我必须从头开始重新实现任何所需的ZeroMQ功能,因为WinPhone 7.5仅支持C#,而不支持C++(它实际上是C#Silverlight应用程序).此外,WinPhone 7.5仅提供其自己的"版本"Socket支持(http://msdn.microsoft.com/en-us/library/sb27wehh%28v=vs.95%29.aspx),它仅支持Async版本的功能,例如ConnectAsync,SendAync,ReceiveAsync等.然而,缺乏C++使得这个问题没有实际意义.
因此,对于WindowsPhone 7.5版本,我仅将应用程序限制为"客户端"(参赛者)功能,并且没有实现"服务器"(测验大师)部分.这是因为应用程序的客户端部分仅发送和接收对服务器的请求,回复和订阅,而服务器利用ZeroMQ的固有多线程多用户功能.为客户端使用重新创建ZeroMQ传输协议/标头(相对)简单,并使用WindowsPhone套接字支持来提供通信.
好的,现在我正在考虑将应用程序移植到Windows 8上的WinRT.(桌面/平板电脑版本首先 - Windows Phone 8 RT SDK还没有出来,但是会类似).好消息是WinRT支持C++,是的!(实际上,它仍然不是那么简单,当编写C#只有WinRT应用程序时,你可以编译'AnyCPU',只要你包含一个C++部分,你就必须构建3个不同的版本 - x86/Win32,x64和ARM版本,但这是一个不同的问题).
不幸的是,像Windows 7/8 Phone一样,WinRT不支持'普通'Berkeley Socket访问,而是提供自己的'版本'的Socket编程,带有用于不同套接字场景的离散类,例如用于连接TCP客户端的StreamSocket(http) ://msdn.microsoft.com/en-us/library/windows/apps/windows.networking.sockets.streamsocket.aspx#methods),用于可绑定TCP服务器的StreamSocketListener(http://msdn.microsoft.com/en -us/library/windows/apps/windows.networking.sockets.streamsocketlistener.aspx#methods)和UDP版本的DatagramSocket/DatagramSocketListener.此外,仅提供所有方法的异步版本.
所以看起来,要让ZeroMQ在WinRT上成功编译,我将不得不编写一个Facade层来提供类似Berkeley Socket的C++接口,并在下面执行必要的映射到WinRT提供的Socket编程版本.
有没有其他人开始这个旅程或写一个类似的门面?有兴趣听取每个人的想法,特别是WinRT看起来非常"重要"!
我试图在使用MonoTouch的C#开发的iPhone应用程序中使用ZeroMQ库.我已经解决了几乎所有的问题,但是在最后一道障碍中倒下了.我正在使用ZeroMQ 2.1.10和C#CLR绑定/包装器,并在Mac OS X 10.6.8中进行开发.这是迄今为止的故事:
我首先尝试在简单的Mono C#Console应用程序中使用ZeroMq.我内置ZeroMQ用./configure,然后make和sudo make install,它安装共享库/usr/local/lib/libzmq.dylib.ZeroMq C#绑定clrzmq.dll是一个包装器,它通过C Api [DllImport]调用使用'核心'ZeroMq功能.
测试应用程序不起作用,我发现标准ZeroMQ ./configure产生64位输出,而Mono只有32位.然后我重建了ZeroMQ
./configure CFLAGS="-O -arch i386" CXXFLAGS="-O -arch i386" LDFLAGS="-arch i386" --disable-dependency-tracking
Run Code Online (Sandbox Code Playgroud)
我的简单C#ZeroMq应用程序然后正常工作.
接下来,我尝试在iPhone模拟器中的iPhone应用程序中使用ZeroMq.我发现iPhone只允许静态链接库(不允许使用动态库).这是通过将所有C#包装器调用更改为来实现的
[DllImport("__Internal", CallingConvention = CallingConvention.Cdecl)]
Run Code Online (Sandbox Code Playgroud)
并libzmq.a直接包含在MonoTouch项目中,并设置额外的mtouch参数
-cxx -gcc_flags "-L${ProjectDir} -lzmq -force_load ${ProjectDir}/libzmq.a"
Run Code Online (Sandbox Code Playgroud)
确保ZeroMQ库包含在iPhone应用程序中.
当它在iPhone模拟器中运行应用程序时,它崩溃了,我追踪到来自一个zmq_init()to 的调用socketpair.我最终将这个跟踪到ZeroMQ库,它是针对我的构建机器的MacOS头文件和库构建的,而不是针对iPhone SDK.这是固定的
./configure CFLAGS="-O -arch i386 -isysroot /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator5.0.sdk" CXXFLAGS="-O -arch i386 -isysroot /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator5.0.sdk" LDFLAGS="-arch i386" --disable-dependency-tracking
Run Code Online (Sandbox Code Playgroud)
在iPhone模拟器中取得成功!模拟器需要为iPhone模拟器SDK构建的i386静态库.我现在可以在模拟器中的iPhone应用程序中使用ZeroMQ功能.然而它在真正的iPhone上不起作用.
这是因为真正的iPhone需要一个为ARM架构而构建的库,以及真正的iPhoneOS SDK.
(构建3个独立的库 - i386,ARM6和ARM7,并将所有3个库组合成可以在任何环境中使用的'fat'库存在一个侧面问题.在我到达之前,我需要能够为ARM构建这个问题).
**最后,我的问题!!** …
Visual Studio 2012(及更早版本)提供预定义的#defines,以便适当地#ifdef ed源代码,请参阅http://msdn.microsoft.com/en-us/library/b0084kay.aspx
我想#ifdef一些C++代码,如果它正在编译(或不编译)为Windows 8运行时(运行时C++/CX的组件扩展),即使用编译器开关/ ZW,请参阅http://msdn.microsoft.com /en-us/library/hh561383.aspx和http://msdn.microsoft.com/en-us/library/xey702bw.aspx
检查C++或CLR编译分别由__cplusplus和__cplusplus_cli(或__CLR_VER)提供,但似乎没有#ifdef for C++/CX/Zw Windows Runtime编译的方法!?
有谁知道吗?谢谢
有没有人知道jsprit求解器默认情况下是否在路径中的两个点之间使用'作为乌鸦苍蝇'的几何距离?如果是这样,是否有可能通过提供jsprit作为参数预先计算的相邻点之间的时间/距离来约束这一点,例如Google Directions计算?
这是为了解决经典问题,例如如果现实世界的旅程来自河口的一侧而没有桥梁可用,那么两点之间的真实距离可能远远超过直线距离?