完成端口线程处理完成后,使用函数PostQueuedCompletionStatus退出线程。可以用它发送一个自定义的包含了OVERLAPPED成员变量的结构地址,里面包含一个状态变量,当状态变量为退出标志时,线程就执行清除动作然后退出:
for(i=0; i<m_nThreadIo; i++){
PostQueuedCompletionStatus(m_hCompletionPort, 0, 0, NULL);}
(2) 解析请求
客户端浏览器通过HTTP协议发送请求。这里使用GET请求就可以完成命令的传输。GET请求是类似于“GET /view HTTP/1.1 Accept: image/gif…”的字符串。服务器端只需要解析GET后面的字符就能解析出不同的命令。采用如下代码实现:
string strUrlTemp;
string strUrlReal;
strUrlTemp=strUrl; // strUrl为客户请求字符串
//搜索GET后面标志符号”/”
int k=strUrlTemp.rfind('/');
if(k>0){//下面根据不同请求,调用相应函数处理 {
strUrlReal=strUrlTemp.substr(k+1,strUrlTemp.length()-k); if(strUrlReal.compare("realdata.htm")==0){//是实时数据,则读取实时数据信息进行显示
if(strUrlReal.compare("realdata.htm")==0) HttpSendData(strUrlReal, bKeepAlive);
if(strUrlReal.compare("realdata1.htm")==0) HttpSendData1(strUrlReal, bKeepAlive);
//设置设备参数
if(strUrlReal.compare("setparam1.htm")==0)
SetDevParam1(strUrlReal, bKeepAlive);
return;
}
(3) 数据发送
数据以HTTP协议发送到客户端。数据格式同客户端约定好,以减少网络数据量,高效率传输为原则。返回的数据包需要先设置HTTP协议头,然后加入回应内容。
客户端有缓存,会造成网页不刷新,不能获取到实时数据,解决方法有两个。将“Cache-Control”头设为“no-Cache”或者设置“Expires”为一个已经过去的时间,如Expires:Fri,15 Feb 1980 09:46:20 GMT。以下为写HTTP协议头代码。
sprintf(pResponseHeader, "HTTP/1.1 200 OK\r\nAccept-Ranges: bytes\r\nContent-Length: %d\r\nConnection: %s\r\nCache-Control: no-Cache\r\nContent-Type: text/html\r\n\r\n",pIoBuffer->GetLen(), bKeepAlive?"Keep-Alive":"close"); 如果是汉字需要进行UTF-8编码,否则会出现乱码。对汉字进行字符集转换,需要遍历整个字符串。如果是英文直接复制,如果是汉字,则利用API函数MultiByteToWide函数进行Unicode转换,再由Unicode转换到UTF-8。本文设计了下面的函数,转换strText 为 UTF-8编码:
|