Итак, у меня есть решение Visual Studio 2013 Update 4 с двумя проектами внутри: один целевой Windows 8.1, другой Windows Phone 8.1, настроенный для создания статической библиотеки.
Проект с открытым исходным кодом, поэтому вот решение для справки: https://github.com/gideros/gideros/tree/master/winrt
Что мне нужно сделать, так это заставить его использовать сетевой код, который использует винсокеты. Поскольку это библиотечный проект, в свойствах проекта не было раздела Linker, поэтому я просто включил
#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
Я начал искать в Интернете, и было много сообщений о том, что вы не можете использовать winsocket в Windows 8.1, вы должны использовать реализацию сокета winrt от Microsoft и т. д.
Но затем я наткнулся на этот блог, в котором сообщалось, что теперь (начиная с VS 2013 Update 3) можно использовать winsock как в Windows 8.1, так и в Windows Phone 8.1.
Цитата:
Мы рады сообщить, что, начиная с выпуска Visual Studio 2013 Update 3 (скачать) в августе, комплект сертификации приложений Windows (WACK) позволяет использовать API-интерфейсы WinSock в ваших приложениях Магазина Windows. А так как WinSock уже разрешили пройти сертификацию на Windows Phone, эта работа завершает рассказ. Теперь WinSock доступен повсеместно в Windows 8.1, Windows Phone 8.1 и универсальных приложениях.
Поскольку у меня был VS 2013 Update 4, он уже должен был работать. Поэтому я проверил версию сертификации приложения (она была 3.3) и сообщил, что доступно обновление, поэтому я загрузил Windows SDK для Windows 8.1 с:
https://dev.windows.com/en-us/develop/app-certification-kit
И теперь я даже не могу собрать проект, потому что он говорит, что все части Ws2_32.lib отсутствуют для цели Windows 8.1. (в то время как Windows Phone 8.1 все еще собирается и работает как положено)
Так возможно ли вообще использовать винсокеты в приложениях Windows 8.1? И если да, то что мне не хватает?
Обновление 1:
Вроде бы можно, но проблема в моей настройке.
Когда я проверяю файлы заголовков, на которые указывает мой проект, они:
для Windows Phone это
Program Files (x86)/Windows Phone Kits/8.1/Include/winsock2.h
для винды это
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
все еще у меня есть тот же самый заголовок. Итак, где я могу получить последнюю версию Windows 8.1 SDK с правильным заголовочным файлом winsock2?
Обновление 2:
Поэтому я удалил все и переустановил чистый VS 2013 Express Update 4 и снова тот же результат, все строится без ошибок, но сеть не работает в приложении Windows 8.1, в то время как оно отлично работает на Windows Phone 8.1.
Это похоже на то, что в Windows 8.1 есть только пустые заглушки, которые ничего не делают.
Я спрашивал на форуме разработчиков Windows, и один из представителей Microsoft заявил об этом, цитируя:
Если у вас правильно установлено обновление 4 для VS 2013, вы получите обновленный пакет SDK для Windows 8.1. В этой версии winsock2.h из Магазина Windows исключены только ASCII-версии большинства API-интерфейсов WinSock. Вы должны использовать UNICODE исключительно для приложений Магазина Windows 8.
К сожалению, я понятия не имею, что это значит и как мне быть дальше. Если это означает определение макроса UNICODE, то он уже определен.
Обновление 3:
Мне удалось отладить код winsocket, и там все работает, как и ожидалось, сервер прослушивает порт. Но ничто не может подключиться к нему. Как будто он работает в режиме песочницы
Обновление 4:
Запуск netstat и wireshark, кажется, работает правильно и видит сервер, и я даже могу подключиться к нему с другого компьютера. Но я не могу подключиться с того же компьютера.
И кажется, что MS запрещает приложениям Windows взаимодействовать с настольными приложениями на одном компьютере.
Я понятия не имею, почему, кто-нибудь может дать какие-либо идеи?
Последний вопрос
Если VS 2013 Update 4 объединяет заголовок winsock2, который создается с WACK 3.3, который не разрешает winsockets, в то время как обновление Windows 8.1 SDK имеет WACK3.4, который разрешает API сокетов, но объединяет старый заголовок winsock2, который не собирается.
Как получить WACK3.4 с правильной настройкой winsock2?