所以我有一个Visual Studio 2013 Update 4解决方案,其中包含2个项目,一个目标是Windows 8.1,其他Windows Phone 8.1配置为构建静态库。
项目是开源的,所以这里是供参考的解决方案: https://github.com/gideros/gideros/tree/master/winrt
我需要做的是使用网络代码,它使用winsockets。由于这是一个库项目,项目属性中没有链接器部分,所以我只包括
#include <WinSock2.h>
#pragma comment(lib, "Ws2_32.lib")
这两个项目都是在没有错误的情况下构建的,当Windows Phone应用程序中包含库时,它的工作方式完全符合预期,但在Windows应用程序网络部分无效,但也没有错误或崩溃。
我通过App认证计划运行它并说:
Error Found: The supported APIs test detected the following errors:
API WSACleanup in ws2_32.dll is not supported for this application type.
以及许多其他对ws2_32库的引用
我开始在互联网上搜索,有很多帖子说你不能在Windows 8.1上使用winsocket,你必须使用微软的winrt套接字实现等。
但后来我偶然发现这个博客宣布现在(自VS 2013 Update 3以来)可以在Windows 8.1和Windows Phone 8.1上使用winsock
引用:
我们很高兴地宣布从Visual的发布开始 8月的Studio 2013 Update 3(下载),Windows应用程序 认证工具包(WACK)允许在Windows中使用WinSock API 存储应用。因为WinSock已被允许通过 在Windows Phone上进行认证,这项工作完成了这个故事。现在 WinSock可在Windows 8.1,Windows Phone中普遍使用 8.1,和通用应用程序。
因为我有VS 2013 Update 4,它应该已经有效了。所以我检查了App认证版本(它是3.3),它声明它有可用的更新,所以我从Windows下载了Windows SDK:
https://dev.windows.com/en-us/develop/app-certification-kit
现在我甚至无法构建项目,因为它表示Windows 8.1目标中缺少所有Ws2_32.lib部分。 (虽然Windows Phone 8.1仍然可以按预期构建和运行)
甚至可以在Windows 8.1应用程序上使用winsockets? 如果是的话,我错过了什么?
更新1:
似乎有可能,但问题在于我的设置。
当我检查项目指向的头文件时,它们是:
用于Windows手机
Program Files (x86)/Windows Phone Kits/8.1/Include/winsock2.h
for Windows it
Program Files (x86)/Windows Kits/8.1/Include/um/WinSock2.h
当我检查用于Windows的文件时,它已定义了预处理器:
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
它不会进入这个if语句,因此编译器这个文件基本上是空的
我甚至尝试卸载Windows 8.1 SDK,它没有改变任何东西。
然后我手动从Program Files文件夹中删除了文件,并从
安装了一个新文件https://dev.windows.com/en-us/develop/app-certification-kit
我仍然有相同的标题。那么我在哪里可以获得带有正确winsock2头文件的最新Windows 8.1 SDK?
更新2:
所以我删除了所有内容并重新安装了干净的VS 2013 Express Update 4,并且同样的结果,它都构建没有错误,但网络在Windows 8.1应用程序上不起作用,而它完全适用于Windows Phone 8.1。
就像Windows 8.1只有空的存根,什么都不做。
我一直在Windows开发者论坛上询问,其中一位微软代表表示,引用:
如果您已正确安装VS 2013 Update 4,那么您将拥有 获得了更新的Windows 8.1 SDK。在那个版本的winsock2.h中,只有 大多数WinSock API的ASCII版本都不包括在内 Windows应用商店。您必须专门为Windows 8 Store使用UNICODE 应用
不幸的是,我不知道这意味着什么,我该怎么办。如果这意味着定义UNICODE宏,那么它已经被定义。
更新3:
我设法调试winsocket代码,一切都按预期运行,服务器正在侦听端口。但没有什么可以连接到它。它就像是以沙盒模式运行
更新4:
运行netstat和wireshark似乎都能正常工作并看到服务器,我甚至可以从其他计算机连接到它。但我无法从同一台计算机连接。
似乎MS禁止Windows应用与同一台机器上的桌面应用进行通信
我不知道为什么,任何人都可以提供任何见解?
How can a Metro app in Windows 8 communicate with a backend desktop app on the same machine?
最后一个问题是
如果VS 2013 Update 4捆绑了使用WACK 3.3构建的winsock2标头,该标头不允许使用winsockets,而Windows 8.1 SDK更新包含允许套接字API的WACK3.4,但捆绑了不构建的旧版winsock2标头。
如何使用正确的winsock2设置获取WACK3.4?
答案 0 :(得分:1)
Windows和Windows Phone支持WinSock,允许使用WACK 3.4。它适用于我#pragma comment(lib, "ws2_32.lib")
和直接向项目设置添加ws2_32.lib
。
看起来升级后构建项目的方式有问题;你可以发布升级后的错误吗?
答案 1 :(得分:0)
所以基本上套接字确实有效,但有几个案例需要注意。
存在网络隔离,它不允许从同一台计算机连接到Windows应用商店应用程序(就像我在测试中所做的那样,并认为网络不起作用)。
但是如果你可以从远程机器连接,一切都按预期工作。
更多信息:
但你仍然无法通过WACK(不需要提交商店,但仍然)
问题是VS 2013 Update 4捆绑了构建和运行的winsock2标头,它有WACK 3.3软件,不允许使用winsockets。
虽然Windows 8.1 SDK更新包含允许套接字API的WACK3.4,但捆绑了较旧的winsock2标头,但它不能构建并运行。
由于你不需要运行WACK提交应用程序,大多数情况下它不会是一个问题,但是因为我需要检查是否有任何其他我使用的特定库,这是可以禁止的,然后我不得不仅从此处安装Windows 8.1 SDK中的单个(App认证)组件:
https://dev.windows.com/en-us/develop/downloads
我现在有WACK 3.4和正确的winsockets
网络隔离仍然太糟糕,这基本上杀死了我首先移植的目的。使所有的工作基本上徒劳无功。