делал приложение для работы, чтобы автоматически отвечать на звонок на моем программном телефоне, когда вы нажимаете на клавиатуру на экране блокировки, поэтому я не пропускаю его, когда в другом конце комнаты.
Я видел, что у окон есть веб-сокеты, поэтому я решил использовать их, чтобы не связывать библиотеки.
Я создал дескриптор websocket .
if (WebSocketCreateClientHandle(NULL, 0, &socket_handle) != S_OK) {
Log::LogMessage("WebSocketCreateClientHandle Failed", Log::LOGLEVEL::CRITICAL);
return 1;
}
Затем запустил WebSocketBeginClientHandshake .
// if handshake is successful, these will be populated
WEB_SOCKET_HTTP_HEADER* responceHeaders = nullptr;
ULONG responceHeadderCount;
if (WebSocketBeginClientHandshake(socket_handle, NULL, 0, NULL, 0, &headers[0], 1, &responceHeaders, &responceHeadderCount) != S_OK) {
return -1;
}
Это вернуло S_OK. Затем я выписал массив заголовков так:
// name nameLength, value valuelength
for (int i = 0; i < responceHeadderCount; i++) {
std::cout << responceHeaders[i].pcName << "x" << responceHeaders[i].ulNameLength << ":" << responceHeaders[i].pcValue << "x" << responceHeaders[i].ulValueLength << std::endl;
}
, который показывает:
Sec-WebSocket-Keyx17:r7XbrevEUv6awqPe24f0Ww==┐å⌐≤w2x24
Connectionx10:Upgradex7
Upgradex7:websocketx9
Sec-WebSocket-Versionx21:13x2
Затем я передаю эти заголовки WebSocketEndClientHandshake , а также некоторым указателям ULONG:
ULONG selected_subprotocol;
ULONG selected_extensions;
ULONG selected_extensions_count;
HRESULT result = WebSocketEndClientHandshake(socket_handle, responceHeaders, responceHeadderCount, &selected_extensions, &selected_extensions_count, &selected_subprotocol);
У меня проблема: WebSocketEndClientHandshake . Он всегда возвращает E_INVALID_PROTOCOL_FORMAT.
Я изменил свой заголовок хоста, чтобы адрес сервера назывался бессмысленным "sdfkbsdf", чтобы увидеть, что он делает, и низкий уровень, и вот, ничего не меняется, BeginHandshake все еще успешен, а EndHandshake терпит неудачу. поэтому мне интересно, связано ли это с моим заголовком Host, который структурирован следующим образом:
WEB_SOCKET_HTTP_HEADER* host = new WEB_SOCKET_HTTP_HEADER;
PCHAR phost = (char*)"Host";
PCHAR pValue = (char*)"https://www.w3.org:80";
host->pcName = phost;
host->ulNameLength = sizeof(phost);
host->pcValue = pValue;
host->ulValueLength = sizeof(pValue);
headers.push_back(*host);
Кто-нибудь знает, что здесь не так?
Я попытался добавить свой заголовок в массив заголовков, возвращаемых BeginClientHandshake, и отправить его в EndClientHandshake, чтобы увидеть, если это что-то изменило, не повезло.