如何使 Ws2_32.lib 与针对 Windows 8.1 的 VS 2013 项目一起工作

How to make Ws2_32.lib work with VS 2013 Project targeted at Windows 8.1

所以我有一个 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 应用程序网络部分不工作,但也没有错误或崩溃。

我运行它通过应用程序认证程序,它说:

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 socket实现等等

但后来我偶然发现了这个博客,它宣布现在(自 VS 2013 更新 3 起)可以在 Windows 8.1 和 Windows Phone 8.1

http://blogs.windows.com/buildingapps/2014/10/13/winsock-and-more-open-source-for-your-windows-store-apps/

引用:

We’re happy to announce that starting with the release of Visual Studio 2013 Update 3 (download) in August, the Windows App Certification Kit (WACK) allows use of WinSock APIs in your Windows Store apps. And since WinSock was already allowed to pass certification on Windows Phone, this work completes the story. Now WinSock is available universally across Windows 8.1, Windows Phone 8.1, and universal apps.

因为我有 VS 2013 Update 4,所以它应该已经可以工作了。所以我检查了 App 认证版本(它是 3.3),它说它有更新可用,所以我从以下位置下载了 Windows SDK for Windows 8.1:

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:

好像可以,但问题出在我的设置上。

当我检查我的项目指向的 header 个文件时,它们是:

对于Windowsphone其

Program Files (x86)/Windows Phone Kits/8.1/Include/winsock2.h

对于Windows它

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

我还是一样header。那么我从哪里获得最新的 Windows 8.1 SDK 和适当的 winsock2 header 文件?

更新二:

所以我删除了所有内容并 re-installed 清理 VS 2013 Express Update 4 并再次得到相同的结果,所有构建都没有错误,但网络在 Windows 8.1 应用程序上不起作用,虽然它完美运行在 Windows Phone 8.1.

就像 Windows 8.1 只有空存根,什么都不做。

我一直在 Windows 开发者论坛中提问,其中一位 Microsoft 代表表示,引用:

If you have VS 2013 Update 4 properly installed, then you will have gotten an updated Windows 8.1 SDK. In that version of winsock2.h, only the ASCII versions of most of the WinSock APIs are excluded from Windows Store. You have to use UNICODE exclusively for Windows 8 Store apps.

不幸的是,我不知道这意味着什么以及我应该如何进行。如果这意味着定义 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 header 不允许 winsockets,而 Windows 8.1 SDK 更新具有允许套接字的 WACK3.4 API,但捆绑了无法构建的旧 winsock2 header。

如何使用正确的 winsock2 设置获取 WACK3.4?

WinSock 在 Windows 和 Windows Phone 上受支持,并且允许使用 WACK 3.4。它适用于我使用 #pragma comment(lib, "ws2_32.lib") 和直接将 ws2_32.lib 添加到项目设置。

看来您在升级后构建项目的方式有问题;你能post升级后遇到的错误吗?

所以基本上套接字可以工作,但有几个情况需要注意。

存在网络隔离,不允许从同一台机器连接到 Windows Store 应用程序(正如我在测试中所做的那样,认为网络不起作用)。

但是如果您可以从远程计算机连接,一切都会按预期进行。

更多信息:

https://msdn.microsoft.com/en-us/library/windows/desktop/dd374089%28v=vs.85%29.aspx?f=255&MSPPError=-2147217396

但是您仍然无法通过 WACK(不需要提交到商店,但仍然)

问题是 VS 2013 Update 4 捆绑了构建和工作的 winsock2 header,并且它有不允许 winsockets 的 WACK 3.3 软件。

虽然 Windows 8.1 SDK 更新具有允许套接字的 WACK3.4 API,但捆绑了无法构建和工作的旧 winsock2 header。

因为您不需要 运行 WACK 来提交应用程序,所以大多数情况下这不会有问题,但是因为我需要检查是否有我使用的任何其他特定库,所以可以禁止,那么我只能从这里安装 Windows 8.1 SDK 中的单个(应用程序认证)组件:

https://dev.windows.com/en-us/develop/downloads

我现在有 WACK 3.4 和合适的 winsockets

网络隔离仍然太糟糕了,这基本上扼杀了我最初移植的目的。让所有的工作基本白费。