MS Http 服务器 API (< Win 8) 和 WebSockets

Posted

技术标签:

【中文标题】MS Http 服务器 API (< Win 8) 和 WebSockets【英文标题】:MS Http Server API (< Win 8) and WebSockets 【发布时间】:2013-05-28 09:35:01 【问题描述】:

我尝试在 win server 2008 下的 MS Http Server API 上实现 WebSocket 协议(没有 HTTP_SEND_RESPONSE_FLAG_OPAQUE 标志)。

HTTP_RESPONSE response=0;
const char upgrade_val[]="Websocket";
response.Headers.KnownHeaders[HttpHeaderUpgrade].RawValueLength=strlen(upgrade_val);
response.Headers.KnownHeaders[HttpHeaderUpgrade].pRawValue     =upgrade_val;
const char connection_val[]="Upgrade";
response.Headers.KnownHeaders[HttpHeaderConnection].RawValueLength=strlen(connection_val);
response.Headers.KnownHeaders[HttpHeaderConnection].pRawValue     =connection_val;
HTTP_UNKNOWN_HEADER unknown[1];
response.Headers.UnknownHeaderCount=1;
response.Headers.pUnknownHeaders   =unknown;
const char accept_name[]="Sec-WebSocket-Accept";
unknown[0].NameLength    =_countof(accept_name)-1;
unknown[0].pName         =accept_name;
unknown[0].RawValueLength=HANDSHAKE_KEY_LENGTH;
unknown[0].pRawValue     =base64_key;
response.Version.MajorVersion=1;
response.Version.MinorVersion=1;
response.StatusCode          =HTTP_SWITCHING_PROTOCOLS;
const char reason[]              ="Switching Protocols";
response.ReasonLength        =strlen(reason);
response.pReason             =reason;
HttpSendHttpResponse(iocp,RequestId,HTTP_SEND_RESPONSE_FLAG_MORE_DATA,&raw_response,NULL,NULL,NULL,NULL,NULL,NULL);

浏览器发送标头(来自 Fiddler)

GET http://server.host/ HTTP/1.1
Upgrade: websocket
Connection: Upgrade
Host: server.host
Origin: null
Pragma: no-cache
Cache-Control: no-cache
Sec-WebSocket-Key: V86c1TFOwWfZqhS42C0arA==
Sec-WebSocket-Version: 13
Sec-WebSocket-Extensions: x-webkit-deflate-frame
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (Khtml, like Gecko)     Chrome/27.0.1453.94 Safari/537.36

服务器的响应(来自 Fiddler)

HTTP/1.1 101 Switching Protocols
Upgrade: Websocket
Server: Microsoft-HTTPAPI/2.0
Sec-WebSocket-Accept: 3io2SU7uJIeFlwy0+OFJUDNrA44=
Date: Tue, 28 May 2013 09:27:59 GMT
EndTime: 13:27:59.006
ReceivedBytes: 0
SentBytes: 0

浏览器显示 1016 错误。

【问题讨论】:

【参考方案1】:

假设您的 Sec-WebSocket-Accept 标头值计算正确,并且假设您的 response 变量应该命名为 raw_response,那么您的响应缺少所需的 Connection: Upgrade 标头,尽管您的代码为其分配了一个值.

【讨论】:

是的,连接:升级丢失,但我在这里写了:response.Headers.KnownHeaders[HttpHeaderConnection].RawValueLength=strlen(connection_val); 我检查了Sec-WebSocket-Accept,密钥有效但无效。 你看到我对raw_responseresponse 的评论了吗?这告诉我你可能没有复制/粘贴你的真实代码。 你能给我一个评论链接吗? 我所指的评论在我上面的回答中:“假设你的 response 变量应该被命名为 raw_response ”。您提供的代码声明了一个 raw_response 变量,但正在填写 response 变量的标头。【参考方案2】:

HTTP_SEND_RESPONSE_FLAG_OPAQUE(Windows 8 及更高版本)是 WebSocket 所必需的。

WebSocket servers on Windows Server (2011-12-20)

就目前而言,Server 2008/R2 机器无法托管 WebSocket。 至少,在与 IIS Web 服务器共享端口 80 和 443 时不会

Re: [hybi] WebSocket protocol as it stands (2010-11-06)

我们需要调整 http.sys 以识别真正的非 HTTP 请求,作为 HTTP 请求

【讨论】:

以上是关于MS Http 服务器 API (< Win 8) 和 WebSockets的主要内容,如果未能解决你的问题,请参考以下文章

windows服务器环境问题---api-ms-win-crt-runtimel1-1-0.dll缺失解决

该程序无法启动,因为在我的计算机上启动 Apache 服务器时缺少 api-ms-win-crt-runtime-l1-1-0.dll [关闭]

关于执行mongod.exe时报api-ms-win-crt-runtimel1-1-0.dll缺失的解决方案

关于api-ms-win-crt-runtimel1-1-0.dll缺失的解决方案

API-MS-Win-Core-Console-L1-1-0.dll提示缺少这个文件

Windows Server 2008 R2提示api-ms-win-crt-runtime-l1-1-0.dll 丢失解决方法