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

蝸牛的家
男兒當自強
posts - 48,  comments - 21,  trackbacks - 0
 1#pragma once
 2
 3#include <afxmt.h>
 4#include <map>
 5
 6using namespace std;
 7
 8#define MAX_PENDING_CONNECTIONS        20
 9#define MAX_WSAEVENT_NUMS            64
10
11class CEventSocket
12{
13public:
14    CEventSocket(void);
15    virtual ~CEventSocket(void);
16
17    virtual void RecvDataNotidy(UINT64 fromAddr, char *pData, int nDataSize) {}
18    virtual void CloseNotidy(UINT64 fromAddr) {}
19
20    BOOL ConnectTo(long ip, int port, int sockType = SOCK_STREAM, int protocol = IPPROTO_TCP);
21
22    BOOL ListenOn(int port, int sockType = SOCK_STREAM, int protocol = IPPROTO_TCP);
23    void Stop();
24    int SendData(UINT64 toAddr, char *pData, int nDataSize);
25
26    void ClosePeer(UINT64 peerAddr);
27protected:
28    static DWORD WINAPI WkThread(LPVOID lParam);
29
30private:
31    int m_nEventTotal;
32    HANDLE m_hWkThread;
33    HANDLE m_hStopEvent;
34    CCriticalSection cs;
35    map<UINT64, int> m_ClientList;
36    WSAEVENT m_EventArray[MAX_WSAEVENT_NUMS];
37    SOCKET m_SockArray[MAX_WSAEVENT_NUMS];
38}
;


實現文件

  1#include "StdAfx.h"
  2#include "EventSocket.h"
  3
  4CEventSocket::CEventSocket(void)
  5{
  6    WSADATA wsaData;
  7    if( (WSAStartup(MAKEWORD(2,2), &wsaData)) != 0 ) 
  8        TRACE(_T("WSAStartup Failed"));
  9    
 10    m_hStopEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
 11    m_nEventTotal = 0;
 12    m_hWkThread = NULL;
 13}

 14
 15CEventSocket::~CEventSocket(void)
 16{
 17    Stop();
 18    WSACleanup();
 19    CloseHandle(m_hStopEvent);
 20}

 21
 22BOOL CEventSocket::ConnectTo(long ip, int port, int sockType, int protocol)
 23{
 24    SOCKADDR_IN skAddr;
 25
 26    skAddr.sin_family = AF_INET;
 27    skAddr.sin_addr.s_addr = ip;
 28    skAddr.sin_port = htons(port);
 29
 30    SOCKET sk = WSASocket(AF_INET, sockType, protocol, NULL, 0, WSA_FLAG_OVERLAPPED);
 31
 32    if (sk == INVALID_SOCKET)
 33    {
 34        TRACE(_T("WSASocket Failed"));
 35        return FALSE;
 36    }

 37    
 38    //1.先將socket設為非堵塞
 39    unsigned long lBlocked = 1;
 40    ioctlsocket(sk,FIONBIO ,&lBlocked);
 41    //2.設置連接超時
 42    struct timeval Timeout = {1,0};
 43    fd_set writefds;
 44    FD_ZERO(&writefds);
 45    FD_SET(sk,&writefds);
 46
 47    connect(sk,(const sockaddr*)&skAddr,sizeof(sockaddr_in));
 48    select(1,  NULL,&writefds, NULL, &Timeout);
 49    //3.將socket設為堵塞
 50    lBlocked = 0;
 51    ioctlsocket(sk, FIONBIO ,&lBlocked);
 52    if ( ! FD_ISSET(sk,&writefds))
 53    {
 54        closesocket(sk);
 55        return FALSE;
 56    }

 57
 58    if (m_nEventTotal >= MAX_WSAEVENT_NUMS)
 59    {
 60        TRACE(_T("Too many Events"));
 61        closesocket(sk);
 62        return FALSE;
 63    }

 64
 65    WSAEVENT wsaEvent = WSACreateEvent();
 66
 67    if (wsaEvent == INVALID_HANDLE_VALUE)
 68    {
 69        closesocket(sk);
 70        TRACE(_T("CreateEvent Failed"));
 71        return FALSE;
 72    }

 73
 74    if (WSAEventSelect(sk, wsaEvent, FD_READ|FD_WRITE|FD_CLOSE) != 0)
 75    {
 76        TRACE(_T("WSAEventSelect Failed"));
 77        closesocket(sk);
 78        CloseHandle(wsaEvent);
 79        return FALSE;
 80    }

 81    
 82    UINT64 fromAddr = (UINT64)skAddr.sin_addr.S_un.S_addr << 32 | ntohs(skAddr.sin_port);
 83    
 84    cs.Lock();
 85    m_ClientList[fromAddr] = m_nEventTotal;
 86    m_EventArray[m_nEventTotal] = wsaEvent;
 87    m_SockArray[m_nEventTotal] = sk;
 88    ++m_nEventTotal;
 89    cs.Unlock();
 90
 91    if (m_hWkThread == NULL)
 92    {
 93        DWORD dwThreadID;
 94        m_hWkThread = ::CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)WkThread, this0&dwThreadID);
 95
 96        if (m_hWkThread == INVALID_HANDLE_VALUE)
 97        {
 98            TRACE(_T("WSAEventSelect Failed"));
 99            closesocket(sk);
100            CloseHandle(wsaEvent);
101            return FALSE;
102        }

103    }

104
105    return TRUE;
106}

107
108
109BOOL CEventSocket::ListenOn(int port, int sockType, int protocol)
110{
111    SOCKADDR_IN skAddr;
112
113    skAddr.sin_family = AF_INET;
114    skAddr.sin_addr.s_addr = ADDR_ANY;
115    skAddr.sin_port = htons(port);
116
117    SOCKET sk = WSASocket(AF_INET, sockType, protocol, NULL, 0, WSA_FLAG_OVERLAPPED);
118
119    if (sk == INVALID_SOCKET)
120    {
121        TRACE(_T("WSASocket Failed"));
122        return FALSE;
123    }

124
125    if( bind(sk, (PSOCKADDR)&skAddr, sizeof(SOCKADDR_IN)) == SOCKET_ERROR ) 
126    {
127        TRACE(_T("Server Soket Bind Failed"));
128        closesocket(sk);
129        return FALSE;
130    }

131
132    if(listen(sk, MAX_PENDING_CONNECTIONS) == SOCKET_ERROR ) 
133    {
134        TRACE(_T("Server Socket Listen Failed"));
135        closesocket(sk);
136        return FALSE;
137    }

138
139    WSAEVENT wsaEvent = WSACreateEvent();
140
141    if (wsaEvent == INVALID_HANDLE_VALUE)
142    {
143        closesocket(sk);
144        TRACE(_T("CreateEvent Failed"));
145        return FALSE;
146    }

147
148    if (WSAEventSelect(sk, wsaEvent, FD_ACCEPT|FD_CLOSE) != 0)
149    {
150        TRACE(_T("WSAEventSelect Failed"));
151        closesocket(sk);
152        CloseHandle(wsaEvent);
153        return FALSE;
154    }

155
156    cs.Lock();
157    m_EventArray[m_nEventTotal] = wsaEvent;
158    m_SockArray[m_nEventTotal] = sk;
159    ++m_nEventTotal;
160    cs.Unlock();
161    
162    if (m_hWkThread == NULL)
163    {
164        DWORD dwThreadID;
165        m_hWkThread = ::CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)WkThread, this0&dwThreadID);
166        if (m_hWkThread == INVALID_HANDLE_VALUE)
167        {
168            TRACE(_T("WSAEventSelect Failed"));
169            closesocket(sk);
170            CloseHandle(wsaEvent);
171            return FALSE;
172        }

173    }

174
175    return TRUE;
176}

177
178
179DWORD WINAPI CEventSocket::WkThread(LPVOID lParam)
180{
181    CEventSocket * pThis = reinterpret_cast<CEventSocket *>(lParam);
182    ASSERT(NULL != pThis);
183
184    while (WaitForSingleObject(pThis->m_hStopEvent, 0== WSA_WAIT_TIMEOUT)
185    {
186        int nIndex = ::WSAWaitForMultipleEvents(pThis->m_nEventTotal, pThis->m_EventArray,
187            FALSE, 500, FALSE);
188
189        if (nIndex == WSA_WAIT_TIMEOUT)
190            continue;
191
192        if (nIndex != WSA_WAIT_FAILED)
193        {
194            nIndex -= WSA_WAIT_EVENT_0;
195            WSANETWORKEVENTS netEvent;
196
197            WSAEnumNetworkEvents(pThis->m_SockArray[nIndex], pThis->m_EventArray[nIndex], &netEvent);
198            WSAResetEvent(pThis->m_EventArray[nIndex]);
199
200            if (netEvent.lNetworkEvents&FD_ACCEPT && netEvent.iErrorCode[FD_ACCEPT_BIT] == 0)
201            {
202                if (pThis->m_nEventTotal >= MAX_WSAEVENT_NUMS)
203                {
204                    TRACE(_T("Too many Events"));
205                    continue;
206                }

207
208                WSAEVENT wsaEvent = WSACreateEvent();
209                SOCKET sk = accept(pThis->m_SockArray[nIndex], NULL, NULL);
210                WSAEventSelect(sk, wsaEvent, FD_READ|FD_WRITE|FD_CLOSE);
211
212                sockaddr_in skAddr = {0};
213                int addrLen = sizeof(sockaddr_in);
214                ::getsockname (sk,(sockaddr*)&skAddr,&addrLen);
215                UINT64 fromAddr = (UINT64) skAddr.sin_addr.S_un.S_addr << 32 | ntohs(skAddr.sin_port);
216                
217                pThis->cs.Lock();
218                pThis->m_ClientList[fromAddr] = pThis->m_nEventTotal;
219                pThis->m_EventArray[pThis->m_nEventTotal] = wsaEvent;
220                pThis->m_SockArray[pThis->m_nEventTotal] = sk;
221                ++pThis->m_nEventTotal;
222                pThis->cs.Unlock();
223            }

224            else if (netEvent.lNetworkEvents&FD_READ &&    netEvent.iErrorCode[FD_READ_BIT] == 0)
225            {
226                char buffer[2048= {0};
227                int nDataSize = recv(pThis->m_SockArray[nIndex], buffer, 20480);
228
229                sockaddr_in skAddr = {0};
230                int addrLen = sizeof(sockaddr_in);
231
232                ::getsockname (pThis->m_SockArray[nIndex],(sockaddr*)&skAddr,&addrLen);
233                UINT64 fromAddr = (UINT64) skAddr.sin_addr.S_un.S_addr << 32 | ntohs(skAddr.sin_port);
234
235                pThis->RecvDataNotidy(fromAddr, buffer, nDataSize);
236            }

237            else if (netEvent.lNetworkEvents&FD_CLOSE && netEvent.iErrorCode[FD_CLOSE_BIT] == 0)
238            {
239                sockaddr_in skAddr = {0};
240                int addrLen = sizeof(sockaddr_in);
241
242                ::getsockname (pThis->m_SockArray[nIndex],(sockaddr*)&skAddr,&addrLen);
243                UINT64 fromAddr = (UINT64) skAddr.sin_addr.S_un.S_addr << 32 | ntohs(skAddr.sin_port);
244
245                pThis->CloseNotidy(fromAddr);
246                
247                pThis->cs.Lock();
248                closesocket(pThis->m_SockArray[nIndex]);
249                WSACloseEvent(pThis->m_EventArray[nIndex]);
250                for (int i = nIndex; i < pThis->m_nEventTotal; i++)
251                {
252                    pThis->m_SockArray[i] = pThis->m_SockArray[i+1];
253                    pThis->m_EventArray[i] = pThis->m_EventArray[i+1];
254                }

255                pThis->m_SockArray[pThis->m_nEventTotal] = NULL;
256                pThis->m_EventArray[pThis->m_nEventTotal] = NULL;
257                -- pThis->m_nEventTotal;
258                map<UINT64, int>::iterator iterIdx = pThis->m_ClientList.find(fromAddr);
259                if (iterIdx != pThis->m_ClientList.end())
260                    pThis->m_ClientList.erase(iterIdx);
261                pThis->cs.Unlock();
262
263            }

264        }

265    }

266
267    return 0;
268}

269
270void CEventSocket::Stop()
271{
272    if (m_hWkThread == NULL)
273        return;
274
275    SetEvent(m_hStopEvent);
276    ::WaitForSingleObject(m_hWkThread, INFINITE);
277    ResetEvent(m_hStopEvent);
278    CloseHandle(m_hWkThread);
279    m_hWkThread = NULL;
280    
281    for (int i = 0; i < m_nEventTotal; i++)
282    {
283        closesocket(m_SockArray[i]);
284        m_SockArray[i] = NULL;
285        WSACloseEvent(m_EventArray[i]);
286        m_EventArray[i] = NULL;
287    }

288
289    m_ClientList.clear();
290}

291
292void CEventSocket::ClosePeer(UINT64 peerAddr)
293{
294
295    cs.Lock();
296    map<UINT64, int>::iterator iterIdx = m_ClientList.find(peerAddr);
297    if (iterIdx != m_ClientList.end())
298    {
299        int nIndex = iterIdx->second;
300        closesocket(m_SockArray[nIndex]);
301        WSACloseEvent(m_EventArray[nIndex]);
302        for (int i = nIndex; i < m_nEventTotal; i++)
303        {
304            m_SockArray[i] = m_SockArray[i+1];
305            m_EventArray[i] = m_EventArray[i+1];
306        }

307        m_SockArray[m_nEventTotal] = NULL;
308        m_EventArray[m_nEventTotal] = NULL;
309        m_ClientList.erase(iterIdx);
310        -- m_nEventTotal;
311    }

312    cs.Unlock();
313}

314
315
316int CEventSocket::SendData(UINT64 toAddr, char *pData, int nDataSize)
317{
318    map<UINT64, int>::iterator iterIdx = m_ClientList.find(toAddr);
319
320    if (iterIdx != m_ClientList.end() && m_SockArray[iterIdx->second] != NULL)
321    {
322        return send(m_SockArray[iterIdx->second], pData, nDataSize, 0);
323    }

324
325    return  -1;
326}
posted on 2008-12-23 13:12 黑色天使 閱讀(602) 評論(0)  編輯 收藏 引用 所屬分類: C\C++

<2008年12月>
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910

常用鏈接

留言簿(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>
            另类国产ts人妖高潮视频| 国产精品资源在线观看| 国产三级精品在线不卡| 久久九九久精品国产免费直播| 欧美亚洲一区| 在线色欧美三级视频| 亚洲日韩视频| 欧美三日本三级三级在线播放| 欧美一区二区三区啪啪| 久久蜜桃精品| 中文亚洲免费| 久久er精品视频| 亚洲免费观看高清完整版在线观看熊 | 国产日韩欧美一二三区| 久久最新视频| 欧美日韩午夜精品| 久久伊人亚洲| 亚洲国产欧美在线| 国产日韩精品久久久| 亚洲国产高清在线观看视频| 国产视频观看一区| 99re6热在线精品视频播放速度| 国产亚洲成年网址在线观看| 最新国产精品拍自在线播放| 国产有码一区二区| 亚洲午夜国产成人av电影男同| 亚洲国产精品激情在线观看| 亚洲欧美日韩综合国产aⅴ| 一本色道久久88综合日韩精品 | 亚洲一区二区欧美| 久久综合狠狠| 久久精品国产99精品国产亚洲性色| 欧美美女bbbb| 亚洲大黄网站| 在线观看成人网| 午夜精品婷婷| 香蕉国产精品偷在线观看不卡| 欧美韩国在线| 欧美肥婆在线| 午夜影院日韩| 亚洲婷婷在线| 欧美激情精品久久久久久大尺度| 久久综合中文| 国产在线播精品第三| 亚洲综合日韩| 亚洲欧美日韩国产中文在线| 欧美日韩亚洲一区三区| 亚洲福利国产| 亚洲国产欧美一区二区三区久久 | 99re66热这里只有精品3直播| 久久久久久夜| 久久偷看各类wc女厕嘘嘘偷窃| 国产欧美日韩专区发布| 亚洲欧美日韩精品在线| 午夜伦理片一区| 国产农村妇女精品一区二区| 亚洲欧美日本精品| 欧美淫片网站| 国产午夜精品一区理论片飘花 | 亚洲精品久久久久久久久久久久 | 亚洲美女免费视频| 欧美成人影音| 亚洲精品美女久久7777777| 99热这里只有成人精品国产| 欧美日韩精品综合在线| 日韩视频在线一区二区| 亚洲天堂av综合网| 国产精品入口尤物| 欧美在线视频观看| 欧美大片第1页| 99视频一区二区三区| 欧美三级午夜理伦三级中文幕 | 在线观看中文字幕不卡| 久久影视精品| 亚洲精品在线一区二区| 亚洲欧美激情一区二区| 国产原创一区二区| 欧美sm重口味系列视频在线观看| 亚洲黄色有码视频| 亚洲综合成人婷婷小说| 国产一区在线看| 欧美xxxx在线观看| 亚洲午夜av电影| 久久一区二区三区av| 亚洲美女视频在线观看| 国产精品日本| 免费黄网站欧美| 亚洲网站在线| 欧美ed2k| 午夜欧美理论片| 亚洲第一区色| 国产精品久久久久9999| 久久久精品国产免大香伊 | 亚洲日本免费| 国产精品日韩二区| 美日韩精品免费观看视频| 亚洲乱码日产精品bd| 久久精品99无色码中文字幕| 欧美激情综合在线| 亚洲欧美国产高清| 亚洲国产精品ⅴa在线观看| 销魂美女一区二区三区视频在线| 在线成人国产| 国产精品大片免费观看| 老司机精品视频一区二区三区| 亚洲图片欧洲图片日韩av| 欧美激情一区二区三区全黄 | 欧美日本免费| 久久天天综合| 性伦欧美刺激片在线观看| 亚洲精品在线观| 免费成人网www| 欧美在线观看网站| 9色国产精品| 亚洲韩日在线| 国色天香一区二区| 国产精品高精视频免费| 免费在线欧美黄色| 欧美一区久久| 亚洲免费在线| 中日韩视频在线观看| 亚洲国产美女精品久久久久∴| 久久躁日日躁aaaaxxxx| 午夜在线一区二区| 亚洲视频在线观看三级| 亚洲看片网站| 亚洲欧洲美洲综合色网| 在线看视频不卡| 国内外成人在线视频| 国产日韩在线视频| 国产欧美高清| 国产人妖伪娘一区91| 国产乱码精品一区二区三区五月婷 | 亚洲国产精品国自产拍av秋霞| 国产亚洲精品久久久久动| 欧美亚洲成人精品| 欧美视频精品在线观看| 欧美日韩1区2区| 欧美久久久久| 欧美日韩国产综合久久| 欧美日韩一区二区三区在线看| 欧美日韩福利| 欧美日韩另类综合| 欧美天天影院| 国产精品你懂得| 国产精品一区二区久久久久| 国产伦精品一区二区三区视频黑人| 国产精品久久久久久超碰| 国产精品国产三级国产aⅴ无密码| 欧美视频日韩| 国产精品伊人日日| 国产亚洲欧美日韩一区二区| 国产亚洲欧洲一区高清在线观看| 国产欧美一区二区精品婷婷| 国产香蕉97碰碰久久人人| 国产一区二区三区在线观看精品| 国产一区二区三区免费观看| 激情小说另类小说亚洲欧美| 136国产福利精品导航网址| 亚洲国产一区二区精品专区| 日韩视频在线观看一区二区| 亚洲视频专区在线| 午夜视频一区| 久久伊人免费视频| 欧美激情a∨在线视频播放| 亚洲国产裸拍裸体视频在线观看乱了中文 | 亚洲一区美女视频在线观看免费| 亚洲欧美国产精品va在线观看| 欧美国产精品久久| 欧美国产亚洲另类动漫| 亚洲精品国产欧美| 亚洲特黄一级片| 欧美有码在线视频| 男女精品网站| 欧美三级免费| 激情综合色综合久久| 日韩视频亚洲视频| 午夜精品久久久久久久| 久久综合伊人77777| 亚洲欧洲另类国产综合| 亚洲免费在线观看视频| 久久综合九色综合网站| 欧美视频在线观看| 韩国av一区| 一本色道久久88精品综合| 欧美一区免费| 欧美激情亚洲一区| 亚洲男人的天堂在线观看 | 久热精品在线视频| 亚洲人精品午夜| 欧美在线视频免费| 欧美日韩一区在线| 激情六月婷婷综合| 亚洲制服欧美中文字幕中文字幕| 牛人盗摄一区二区三区视频| 中文在线一区| 男男成人高潮片免费网站| 国产伦精品一区二区三区免费| 最近中文字幕日韩精品 | 久久综合狠狠综合久久激情|