青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

蝸牛的家
男兒當自強
posts - 48,  comments - 21,  trackbacks - 0
#pragma once

#include 
<WinSock2.h>


class CHpServer
{
public:
    CHpServer(
void);
    
virtual ~CHpServer(void);

    BOOL StartSever(CString RootDir, u_short port);
    
void StopServer();

protected:
    BOOL RecvRequest(SOCKET sk, HANDLE hExit, PCHAR pBuf, DWORD bufSize);
    
int ParseRequest(PCHAR lpBuf, CString &fileName);
    
void SendFile(SOCKET sk, HANDLE hExit, CString filePath);
    BOOL SendBuffer(SOCKET sk, HANDLE hExit, PCHAR pBuf, DWORD bufSize);


    
static DWORD WINAPI ListenThread(PVOID lParam);
    
static DWORD WINAPI ClientThread(PVOID lParam);

private:
    SOCKET m_lsSocket;
    CString m_RootDir;
}
;


typedef 
struct stg_Req
{
    SOCKET skClient;
    HANDLE hExitEvent;
    CString rootDir;
    CHpServer
* pThis;
}
REQUEST, *LPReq;


  1#include "StdAfx.h"
  2#include "HpServer.h"
  3
  4CHpServer::CHpServer(void)
  5{
  6    WSADATA wsaData;
  7    WSAStartup(MAKEWORD(2,2), &wsaData);
  8
  9    m_lsSocket = INVALID_SOCKET;
 10}

 11
 12CHpServer::~CHpServer(void)
 13{
 14    WSACleanup();
 15}

 16
 17BOOL CHpServer::StartSever(CString RootDir, u_short port)
 18{
 19    if (strcmp(RootDir, _T("")) == 0)
 20        return FALSE;
 21
 22    m_RootDir = RootDir;
 23    m_lsSocket = WSASocket(AF_INET, SOCK_STREAM, 0, NULL, 0, WSA_FLAG_OVERLAPPED);
 24    SOCKADDR_IN sk_Addr;
 25
 26    sk_Addr.sin_family = AF_INET;
 27    sk_Addr.sin_port = htons(port);
 28    sk_Addr.sin_addr.s_addr = ADDR_ANY;
 29
 30    if (bind(m_lsSocket, (LPSOCKADDR)&sk_Addr, sizeof(struct sockaddr)) == SOCKET_ERROR)
 31    {
 32        closesocket(m_lsSocket);
 33        return FALSE;
 34    }

 35    if (listen(m_lsSocket, 10== SOCKET_ERROR)
 36    {
 37        closesocket(m_lsSocket);
 38        return FALSE;
 39    }

 40    
 41    DWORD dwThreadID;
 42    HANDLE hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ListenThread, this, NULL, &dwThreadID);
 43    if (hThread == INVALID_HANDLE_VALUE)
 44        return FALSE;
 45    CloseHandle(hThread);
 46
 47    return TRUE;
 48}

 49
 50void CHpServer::StopServer()
 51{
 52    if (m_lsSocket != INVALID_SOCKET)
 53    {
 54        closesocket(m_lsSocket);
 55        m_lsSocket = INVALID_SOCKET;
 56    }

 57}

 58
 59DWORD WINAPI CHpServer::ListenThread(PVOID lParam)
 60{
 61    CHpServer* pThis = (CHpServer*)lParam;
 62    HANDLE hExitEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
 63
 64    while (TRUE)
 65    {
 66        SOCKADDR_IN sk_Addr;
 67        int nSize = sizeof(sk_Addr);
 68        SOCKET skClient = accept(pThis->m_lsSocket, (PSOCKADDR)&sk_Addr, &nSize);
 69
 70        if (skClient == INVALID_SOCKET)
 71            break;
 72
 73        LPReq lpReq = new REQUEST;
 74        lpReq->skClient = skClient;
 75        lpReq->hExitEvent = hExitEvent;
 76        lpReq->rootDir = pThis->m_RootDir;
 77
 78        DWORD dwThreadID;
 79        HANDLE hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ClientThread, lpReq, NULL, &dwThreadID);
 80        if (hThread == INVALID_HANDLE_VALUE)
 81        {
 82            closesocket(skClient);
 83            delete lpReq;
 84            continue;
 85        }

 86        CloseHandle(hThread);
 87    }

 88    SetEvent(hExitEvent);
 89    Sleep(1000);    //等待服務線程退出
 90    CloseHandle(hExitEvent);
 91
 92    return 1;
 93}

 94
 95DWORD WINAPI CHpServer::ClientThread(PVOID lParam)
 96{
 97    LPReq lpReq = (LPReq)lParam;
 98    
 99    CHAR buf[1024];
100
101    if (!lpReq->pThis->RecvRequest(lpReq->skClient, lpReq->hExitEvent, buf, 1024))
102    {
103        closesocket(lpReq->skClient);
104        delete lpReq;
105        return 1;
106    }

107    CString filePath = lpReq->rootDir;
108
109    if (!lpReq->pThis->ParseRequest(buf, filePath))
110    {
111        closesocket(lpReq->skClient);
112        delete lpReq;
113        return 1;
114    }

115    
116    lpReq->pThis->SendFile(lpReq->skClient, lpReq->hExitEvent, filePath);
117
118    closesocket(lpReq->skClient);
119    delete lpReq;
120    return 1;
121}

122
123
124BOOL CHpServer::RecvRequest(SOCKET sk, HANDLE hExit, PCHAR pBuf, DWORD bufSize)
125{
126    memset(pBuf, 0, bufSize);
127
128    WSABUF wsaBuf;
129    WSAOVERLAPPED wsaOver;
130
131    wsaBuf.buf = pBuf;
132    wsaBuf.len = bufSize;
133    wsaOver.hEvent = WSACreateEvent();
134    
135    DWORD dwRecvSize, dwFlags = 0;
136    int nRet = WSARecv(sk, &wsaBuf, 1&dwRecvSize, &dwFlags, &wsaOver, NULL);
137    
138    if (nRet != 0 && WSAGetLastError() != WSA_IO_PENDING)
139    {
140        CloseHandle(wsaOver.hEvent);
141        return FALSE;
142    }

143
144    if (nRet != 0)
145    {
146        HANDLE hEvents[2= {wsaOver.hEvent, hExit};
147
148        if ( WaitForMultipleObjects(2, hEvents, FALSE, INFINITE) != 0)
149        {
150            CloseHandle(wsaOver.hEvent);
151            return FALSE;
152        }

153
154        if (!WSAGetOverlappedResult(sk,
155                &wsaOver,
156                &dwRecvSize,
157                FALSE,
158                &dwFlags))
159        {
160            CloseHandle(wsaOver.hEvent);
161            return FALSE;
162        }

163    }

164
165    CloseHandle(wsaOver.hEvent);
166    return TRUE;
167}

168
169int CHpServer::ParseRequest(PCHAR lpBuf, CString &filePath)
170{
171    PCHAR cpNtToken;
172    PCHAR cpToken = strtok_s(lpBuf, _T(" \n"), &cpNtToken);
173
174    if (strcmp(cpToken, _T("GET")) != 0)
175        return 0;
176
177    cpToken = strtok_s(NULL, _T(" \n"), &cpNtToken);
178    if (cpToken == NULL)
179        return 0;
180    
181    filePath.Format(_T("%s%s"),filePath, cpToken);
182
183    return 1;
184}

185
186
187void CHpServer::SendFile(SOCKET sk, HANDLE hExit, CString fileName)
188{
189    HANDLE hFile = CreateFile(fileName,
190        GENERIC_READ,
191        FILE_SHARE_READ,
192        NULL,
193        OPEN_EXISTING,
194        FILE_ATTRIBUTE_NORMAL,
195        NULL);
196
197    if (hFile == INVALID_HANDLE_VALUE)
198        return;
199
200    DWORD dwSize = GetFileSize(hFile,NULL);
201    TCHAR pResponseHeader[1024];
202    sprintf_s(pResponseHeader, 1024,
203        _T("HTTP/1.1 200 OK\r\nAccept-Ranges: bytes\r\nContent-Length: "\
204        "%d\r\nConnection: Keep-Alive\r\nContent-Type: text/plain\r\n\r\n"),
205        dwSize);
206    SendBuffer(sk,hExit,pResponseHeader,strlen(pResponseHeader));
207
208    static CHAR buf[1024];
209    while (WaitForSingleObject(hExit, 0== WAIT_TIMEOUT)
210    {
211        DWORD dwSize;
212        if (!ReadFile(hFile, buf, 1024&dwSize, NULL) || dwSize == 0)
213            break;
214
215        if (!SendBuffer(sk, hExit, buf, dwSize))
216            break;
217    }

218
219    CloseHandle(hFile);
220}

221
222BOOL CHpServer::SendBuffer(SOCKET sk, HANDLE hExit, PCHAR pBuf, DWORD bufSize)
223{
224    WSABUF wsaBuf;
225    WSAOVERLAPPED wsaOver;
226
227    wsaBuf.buf = pBuf;
228    wsaBuf.len = bufSize;
229    wsaOver.hEvent = WSACreateEvent();
230    
231    DWORD dwRecv, dwFlags;
232    int nRet = WSASend(sk, &wsaBuf, 1&dwRecv, 0&wsaOver, NULL); 
233    if (nRet != 0 && WSAGetLastError() != WSA_IO_PENDING)
234        return FALSE;
235    
236    if (nRet != 0)
237    {
238        HANDLE hEvents[2= {wsaOver.hEvent, hExit};
239
240        if (WaitForMultipleObjects(2, hEvents, FALSE, INFINITE) != 0)
241        {
242            CloseHandle(wsaOver.hEvent);
243            return FALSE;
244        }

245
246        if (!WSAGetOverlappedResult(sk, &wsaOver, &dwRecv, FALSE, &dwFlags))
247        {
248            CloseHandle(wsaOver.hEvent);
249            return FALSE;
250        }

251    }

252    
253    CloseHandle(wsaOver.hEvent);
254    return TRUE;
255}

256
257
posted on 2008-12-30 16:51 黑色天使 閱讀(357) 評論(0)  編輯 收藏 引用 所屬分類: 網絡開發

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理



<2008年8月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
31123456

常用鏈接

留言簿(2)

隨筆分類

隨筆檔案

文章檔案

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美 日韩 国产精品免费观看| 一本色道久久综合亚洲精品婷婷| 久久久青草青青国产亚洲免观| 亚洲国产精品成人综合色在线婷婷| 亚洲精品欧美日韩专区| 久久精品亚洲一区二区| 国产亚洲a∨片在线观看| 亚洲欧美日韩爽爽影院| 一区二区冒白浆视频| 欧美日韩国产综合新一区| 亚洲美女在线看| 亚洲激情一区二区| 欧美国产第二页| 亚洲精品激情| 亚洲精品欧美激情| 亚洲二区在线观看| 欧美a级一区| 亚洲精品三级| 亚洲精品综合久久中文字幕| 欧美日韩国产色综合一二三四| 亚洲美女尤物影院| 一区二区动漫| 国产亚洲精品v| 美国三级日本三级久久99| 欧美xxx成人| 亚洲深夜av| 性欧美激情精品| 亚洲激情国产| 日韩午夜视频在线观看| 国产伦精品一区二区三区高清版| 久久久精品日韩| 免费亚洲网站| 亚洲主播在线| 久久国产精品久久精品国产| 在线成人激情视频| 日韩一二三区视频| 国产欧美日韩麻豆91| 欧美va亚洲va国产综合| 欧美日韩亚洲一区二区三区在线| 午夜精品福利电影| 久久久99久久精品女同性| 亚洲精品一区在线观看香蕉| 国产精品99久久久久久白浆小说| 国产日韩精品一区观看| 亚洲高清视频一区二区| 国产精品久久二区| 免费的成人av| 国产精品高潮久久| 免费日韩精品中文字幕视频在线| 欧美精品在线免费| 久久久99免费视频| 欧美精品一区二区三区高清aⅴ| 欧美一区二区三区在线播放| 狂野欧美激情性xxxx欧美| 亚洲一区二区视频在线观看| 久久久久欧美精品| 午夜久久电影网| 欧美二区在线播放| 久久天天躁狠狠躁夜夜av| 欧美午夜精品一区| 欧美激情一二三区| 国内偷自视频区视频综合| 99成人免费视频| 亚洲精品日韩在线| 久久久久se| 欧美在线视频免费观看| 欧美日韩第一区| 欧美激情一区二区三区在线| 国产中文一区| 亚洲一级二级| 一区二区三区四区蜜桃| 欧美va亚洲va香蕉在线| 久久久久久久久久久成人| 欧美日韩在线播放| 欧美大片91| 国产自产2019最新不卡| 亚洲一区免费视频| 亚洲一二三区视频在线观看| 免费观看在线综合| 欧美+日本+国产+在线a∨观看| 国产精品一区久久久| 午夜亚洲激情| 欧美日韩免费在线观看| 亚洲高清在线视频| 在线观看亚洲精品视频| 久久精品国产96久久久香蕉 | 亚洲国产专区校园欧美| 影音先锋一区| 久久精品视频免费播放| 久久久精品网| 国产日韩精品在线| 午夜日韩在线观看| 欧美怡红院视频一区二区三区| 国产精品成人一区二区艾草| 99re热这里只有精品免费视频| 亚洲美女视频在线观看| 欧美国产日本高清在线| 欧美国产日本| 亚洲精品中文字幕在线| 欧美大片在线观看一区| 亚洲人成人一区二区在线观看| 亚洲国产日韩一区| 美女视频一区免费观看| 亚洲激情小视频| 一本一道久久综合狠狠老精东影业 | 国内精品久久久久影院薰衣草| 午夜精品一区二区三区在线播放 | 一卡二卡3卡四卡高清精品视频 | 久久久99久久精品女同性| 国产欧美日韩视频| 欧美一级淫片aaaaaaa视频| 久久精品久久99精品久久| 黑人巨大精品欧美一区二区| 美女久久一区| 亚洲伦理一区| 亚洲欧美精品| 黄色工厂这里只有精品| 久久综合网hezyo| 亚洲人成人一区二区三区| 亚洲欧美一区二区视频| 国产一区二区中文字幕免费看| 久热这里只精品99re8久| 亚洲欧洲另类| 欧美亚洲一区在线| 亚洲国产精品久久久| 欧美日韩亚洲综合| 久久成人精品视频| 亚洲国产综合在线| 欧美中文字幕第一页| 亚洲电影中文字幕| 国产精品日韩一区二区三区| 另类天堂av| 亚洲欧美精品中文字幕在线| 欧美韩国一区| 久久精品视频免费播放| 中日韩在线视频| 在线日韩中文字幕| 国产精品影院在线观看| 欧美jizz19hd性欧美| 欧美在线视频一区| 一区二区三区视频在线观看| 欧美岛国在线观看| 国产精品无码永久免费888| 免费久久99精品国产自| 亚洲欧美激情诱惑| 亚洲美女色禁图| 美日韩丰满少妇在线观看| 亚洲欧美综合v| 一本一本a久久| 亚洲国产精品va在线观看黑人| 国产精品入口夜色视频大尺度| 欧美电影打屁股sp| 久久野战av| 欧美在线综合视频| 亚洲一区999| 亚洲精品永久免费| 亚洲国产精品电影| 久久综合伊人77777| 欧美综合第一页| 亚洲欧美一区二区三区极速播放 | 在线看日韩欧美| 国产日韩欧美综合| 欧美日韩一区二区三区在线观看免| 久久久另类综合| 欧美一区二视频| 亚洲一区二区精品视频| 一区二区三区产品免费精品久久75| 亚洲春色另类小说| 欧美国产极速在线| 欧美电影免费观看高清完整版| 久久久亚洲国产美女国产盗摄| 欧美一级在线播放| 欧美一级淫片aaaaaaa视频| 午夜精品久久久久久久白皮肤| 亚洲午夜精品网| 亚洲永久免费视频| 午夜久久久久久久久久一区二区| 亚洲一二区在线| 午夜免费在线观看精品视频| 亚洲欧美日韩国产一区| 欧美一区二区啪啪| 久久久精品国产99久久精品芒果| 久久久久成人精品| 老司机aⅴ在线精品导航| 麻豆9191精品国产| 亚洲电影第1页| 亚洲精品日韩综合观看成人91| 亚洲精品一区二区三| 亚洲午夜视频在线观看| 午夜精品久久久久久久| 久久精品国产免费看久久精品| 久久另类ts人妖一区二区| 鲁大师影院一区二区三区| 欧美精品成人91久久久久久久| 欧美三级午夜理伦三级中视频| 国产精品外国| 一区免费观看视频| 亚洲伦伦在线| 欧美一区91| 欧美.日韩.国产.一区.二区|