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

蝸牛的家
男兒當自強
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);    //等待服務(wù)線程退出
 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)  編輯 收藏 引用 所屬分類: 網(wǎng)絡(luò)開發(fā)

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



<2009年1月>
28293031123
45678910
11121314151617
18192021222324
25262728293031
1234567

常用鏈接

留言簿(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>
            久久久中精品2020中文| 欧美午夜精品理论片a级大开眼界| 欧美在线日韩| 欧美日韩亚洲一区二区三区| 国产女主播视频一区二区| 一区二区三区国产在线| 欧美aa在线视频| 欧美一区二区三区四区在线观看地址| 欧美日韩国产综合视频在线| 一区二区亚洲精品国产| 久久久久一区二区三区| 亚洲综合三区| 国产精品亚洲网站| 欧美一区精品| 羞羞漫画18久久大片| 国产精品你懂得| 亚洲欧美日韩综合一区| 亚洲综合日本| 激情欧美一区| 亚洲国产高清自拍| 美女尤物久久精品| 91久久久亚洲精品| 亚洲高清中文字幕| 欧美—级高清免费播放| 亚洲精品视频免费| 亚洲电影一级黄| 欧美精品九九99久久| 一区二区三区你懂的| 亚洲精品专区| 国产精品免费福利| 蜜桃视频一区| 欧美激情综合| 欧美一级在线视频| 久久久免费观看视频| 亚洲人成网站777色婷婷| 99热在这里有精品免费| 国产精品永久| 免费欧美视频| 欧美日韩一区二| 久久精品官网| 欧美成人综合一区| 亚洲一区二区三区四区视频| 欧美一站二站| 99这里有精品| 欧美在线亚洲在线| 一本色道精品久久一区二区三区 | 国产日韩欧美制服另类| 欧美一区2区三区4区公司二百| 久久国产黑丝| 夜夜嗨一区二区| 午夜精品久久久久久久久久久久久 | 欧美激情一区二区三区| 亚洲在线免费视频| 久久色在线播放| 亚洲视频中文| 久久一二三国产| 亚洲一区二区三区免费观看| 久久久久久网址| 亚洲中字在线| 欧美精品一线| 久久天堂精品| 国产精品久久久久9999| 欧美成人性生活| 国产日韩一区二区三区在线| 亚洲福利视频免费观看| 国产日韩欧美在线播放| 久久综合电影| 国产精品亚洲аv天堂网 | 国产精品激情电影| 久久精品盗摄| 国产精品一区在线播放| 欧美a级一区| 欧美日韩免费在线| 久久婷婷国产综合国色天香| 欧美日韩亚洲激情| 久久成人这里只有精品| 欧美成人福利视频| 麻豆视频一区二区| 国内精品美女在线观看| 日韩一级精品视频在线观看| 亚洲高清在线| 久久免费黄色| 欧美一区二区久久久| 欧美三级乱码| 亚洲免费观看高清完整版在线观看| 一区二区三区在线视频观看| 亚洲欧美影院| 亚洲欧美成人网| 欧美色视频日本高清在线观看| 亚洲黄页一区| 亚洲激情在线激情| 久久这里只有| 乱中年女人伦av一区二区| 黄色一区二区三区| 一本色道婷婷久久欧美| 91久久久亚洲精品| 免费人成网站在线观看欧美高清| 你懂的网址国产 欧美| 亚洲福利视频在线| 快she精品国产999| 可以免费看不卡的av网站| 国产麻豆91精品| 亚洲制服欧美中文字幕中文字幕| 午夜精品久久久久久久久久久| 国产精品色婷婷久久58| 在线亚洲成人| 久久激情视频| 国产午夜一区二区三区| 久久精品一区二区| 亚洲一区二区免费在线| 亚洲三级网站| 亚洲黄色视屏| 亚洲一区二区久久| 久久成人羞羞网站| 久久综合伊人77777| 美女视频黄免费的久久| 久久―日本道色综合久久| 伊人久久男人天堂| 亚洲日本va在线观看| 激情久久久久| 免费观看一级特黄欧美大片| 亚洲国产毛片完整版| 99日韩精品| 欧美激情视频一区二区三区免费 | 久久亚洲精品伦理| 亚洲第一精品夜夜躁人人爽| 欧美精品一区二区三区一线天视频| 亚洲精品免费在线| 羞羞答答国产精品www一本| 精品成人久久| 欧美日韩大片一区二区三区| 亚洲一区日韩在线| 免费一级欧美片在线播放| 亚洲午夜精品在线| 国内精品一区二区三区| 免播放器亚洲一区| 免费在线视频一区| 亚洲日本视频| 国产精品一区毛片| 欧美一区深夜视频| 一区二区三区欧美视频| 久久久久久久尹人综合网亚洲| 亚洲激情国产| 欧美色图一区二区三区| 久久理论片午夜琪琪电影网| 一本色道久久综合狠狠躁篇的优点| 久久久99久久精品女同性| 国产精品99久久久久久久久久久久| 韩日精品视频| 国产精品久久久久久av福利软件 | 亚洲春色另类小说| 国产美女一区二区| 久久精品三级| 午夜精品一区二区在线观看| 亚洲精品欧美在线| 欧美成人精品福利| 国产精品99久久久久久白浆小说| 揄拍成人国产精品视频| 蜜桃av综合| 久久一区二区精品| 欧美在线啊v| 99爱精品视频| 亚洲三级免费| 亚洲日本成人网| 一区二区三区回区在观看免费视频| 久久综合九色九九| 欧美精品一级| 久久爱www.| 新狼窝色av性久久久久久| 亚洲国产精品一区制服丝袜| 久久久精品国产99久久精品芒果| 亚洲一区在线免费| 亚洲丝袜av一区| 国产精品99久久久久久白浆小说| 亚洲精品欧洲| 亚洲国产视频a| 亚洲高清一二三区| 亚洲国产日韩精品| 亚洲高清免费视频| 精品不卡一区| 国产亚洲欧美日韩日本| 国产午夜精品一区理论片飘花 | 快射av在线播放一区| 欧美专区在线观看一区| 久久精品99无色码中文字幕| 亚洲欧美日韩第一区 | 亚洲网友自拍| 一区二区三区www| 亚洲欧美日韩国产综合在线| 国产精品99久久久久久久vr| 一区二区成人精品| 亚洲一区在线视频| 亚洲欧美成人| 欧美在线啊v| 欧美gay视频| 欧美高清视频| 国产精品入口夜色视频大尺度| 国产美女高潮久久白浆| 精品88久久久久88久久久| 亚洲国产另类久久久精品极度|