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

S.l.e!ep.¢%

像打了激速一樣,以四倍的速度運(yùn)轉(zhuǎn),開心的工作
簡(jiǎn)單、開放、平等的公司文化;尊重個(gè)性、自由與個(gè)人價(jià)值;
posts - 1098, comments - 335, trackbacks - 0, articles - 1
  C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理
純c語言實(shí)現(xiàn)的IOCP服務(wù)器,網(wǎng)上找了很多都是c++的 [轉(zhuǎn)帖 2008.10.15 22:48:28] ??
我頂 字號(hào):

轉(zhuǎn)自于:http://hi.baidu.com/netpet/blog/item/bb5ebdb7fd4650f030add1a1.html

代碼如下,注釋已經(jīng)全部改成中文

#include?? <winsock2.h>??
//#include?? <windows.h>??
#include?? <stdio.h>??

#define?? PORT?? 5150??
#define?? DATA_BUFSIZE?? 8192??
???
typedef?? struct??
{??
??????? OVERLAPPED?? Overlapped;??
??????? WSABUF?? DataBuf;??
??????? CHAR?? Buffer[DATA_BUFSIZE];??
??????? DWORD?? BytesSEND;??
??????? DWORD?? BytesRECV;??
}?? PER_IO_OPERATION_DATA,?? *?? LPPER_IO_OPERATION_DATA;??
???
???
typedef?? struct????
{??
??????? SOCKET?? Socket;??
}?? PER_HANDLE_DATA,?? *?? LPPER_HANDLE_DATA;??
???
???
DWORD?? WINAPI?? ServerWorkerThread(LPVOID?? CompletionPortID);??
???
int main(void)??
{??
??????? SOCKADDR_IN?? InternetAddr;??
??????? SOCKET?? Listen;??
??????? SOCKET?? Accept;??
??????? HANDLE?? CompletionPort;??
??????? SYSTEM_INFO?? SystemInfo;??
??????? LPPER_HANDLE_DATA?? PerHandleData;??
??????? LPPER_IO_OPERATION_DATA?? PerIoData;??
??????? int?? i;??
??????? DWORD?? RecvBytes;??
??????? DWORD?? Flags;??
??????? DWORD?? ThreadID;??
??????? WSADATA?? wsaData;??
??????? DWORD?? Ret;??
???
??????? if?? ((Ret?? =?? WSAStartup(0x0202,?? &wsaData))?? !=?? 0)??
??????? {??
????????????? printf("WSAStartup失敗了,錯(cuò)誤信息如下:?? %d\n",?? Ret);??
????????????? return;??
??????? }??
???
??????? // 設(shè)置一個(gè)I/O完成端口.??
???
??????? if?? ((CompletionPort?? =?? CreateIoCompletionPort(INVALID_HANDLE_VALUE,?? NULL,?? 0,?? 0))?? ==?? NULL)??
??????? {??
????????????? printf(?? "CreateIoCompletionPort 失敗了,錯(cuò)誤信息如下:?? %d\n",?? GetLastError());??
????????????? return;??
??????? }??
???
??????? // 測(cè)試系統(tǒng)中有多少cpu處理器
???
??????? GetSystemInfo(&SystemInfo);??
???
??????? //?? 基于系統(tǒng)可用的處理器創(chuàng)建工作線程,為每個(gè)處理器創(chuàng)建連個(gè)線程??
???
??????? for(i?? =?? 0;?? i?? <?? SystemInfo.dwNumberOfProcessors?? *?? 2;?? i++)??
??????? {??
????????????? HANDLE?? ThreadHandle;??
???
????????????? // 創(chuàng)建一個(gè)服務(wù)端線程并且傳遞一個(gè)完成端口給這個(gè)線程.??
???
????????????? if?? ((ThreadHandle?? =?? CreateThread(NULL,?? 0,?? ServerWorkerThread,?? CompletionPort,??
??????????????????? 0,?? &ThreadID))?? ==?? NULL)??
????????????? {??
??????????????????? printf("CreateThread()發(fā)生了如下錯(cuò)誤: %d\n",?? GetLastError());??
??????????????????? return;??
????????????? }??
????????????? else
????????????? {printf("創(chuàng)建了一個(gè)完成端口.\n");
????????????? }
????????????? //?? 關(guān)閉 thread句柄
????????????? CloseHandle(ThreadHandle);??
??????? }??
???
??????? //?? 創(chuàng)建一個(gè)監(jiān)聽套接字
???
??????? if?? ((Listen?? =WSASocket(AF_INET,?? SOCK_STREAM,?? 0,?? NULL,0,WSA_FLAG_OVERLAPPED))?? ==?? INVALID_SOCKET)??
??????? {??
????????????? printf("WSASocket() 發(fā)生了如下錯(cuò)誤: %d\n",?? WSAGetLastError());??
????????????? return;??
??????? }
??????? else????
??????? {printf("創(chuàng)建監(jiān)聽套接字成功\n");}
??????? InternetAddr.sin_family?? =?? AF_INET;??
??????? InternetAddr.sin_addr.s_addr?? =?? htonl(INADDR_ANY);??
??????? InternetAddr.sin_port?? =?? htons(PORT);??
???
??????? if?? (bind(Listen,?? (PSOCKADDR)?? &InternetAddr,?? sizeof(InternetAddr))?? ==?? SOCKET_ERROR)??
??????? {??
????????????? printf("bind()端口或IP時(shí)發(fā)生了如下錯(cuò)誤: %d\n",?? WSAGetLastError());??
????????????? return;??
??????? }??
??????? else
??????? {printf("綁定端口%d成功\n",PORT);}
??????? // 準(zhǔn)備socket 用來監(jiān)聽??
???
??????? if?? (listen(Listen,?? 5)?? ==?? SOCKET_ERROR)??
??????? {??
????????????? printf("listen() 發(fā)生了如下錯(cuò)誤?? %d\n",?? WSAGetLastError());??
????????????? return;??
??????? }??
???????? else
??????? {printf("預(yù)處理成功,開始在端口 %d 處監(jiān)聽...\n",PORT);}
??????? //接受連接并且交給完成端口處理
???
??????? while(TRUE)??
??????? {??
????????????? if?? ((Accept?? =?? WSAAccept(Listen,?? NULL,?? NULL,?? NULL,?? 0))?? ==?? SOCKET_ERROR)??
????????????? {??
??????????????????? printf("WSAAccept()?? 發(fā)生了如下錯(cuò)誤:?? %d\n",?? WSAGetLastError());??
??????????????????? return;??
????????????? }??
???
????????????? // 創(chuàng)建一個(gè)套接字信息結(jié)構(gòu)體去聯(lián)系起來socket??
????????????? if?? ((PerHandleData?? =?? (LPPER_HANDLE_DATA)?? GlobalAlloc(GPTR,????
??????????????????? sizeof(PER_HANDLE_DATA)))?? ==?? NULL)??
????????????? {??
??????????????????? printf("GlobalAlloc()?? 發(fā)生了如下錯(cuò)誤:?? %d\n",?? GetLastError());??
??????????????????? return;??
????????????? }??
???
????????????? // 將接受到的套接字與原始的完成端口聯(lián)系起來.??
???
????????????? printf("號(hào)碼為?? %d?? 的socket連接上了\n",?? Accept);??
????????????? PerHandleData->Socket?? =?? Accept;??
???
????????????? if?? (CreateIoCompletionPort((HANDLE)?? Accept,?? CompletionPort,?? (DWORD)?? PerHandleData,??
??????????????????? 0)?? ==?? NULL)??
????????????? {??
??????????????????? printf("CreateIoCompletionPort?? 發(fā)生了如下錯(cuò)誤:?? %d\n",?? GetLastError());??
??????????????????? return;??
????????????? }??
???
????????????? //?? 創(chuàng)建每一個(gè)I/O 套接字信息結(jié)構(gòu)體去和下面被調(diào)用的 to?? associate?? with?? the????
????????????? //?? WSARecv 連接.??
???
????????????? if?? ((PerIoData?? =?? (LPPER_IO_OPERATION_DATA)?? GlobalAlloc(GPTR,???????????????????? sizeof(PER_IO_OPERATION_DATA)))?? ==?? NULL)??
????????????? {??
??????????????????? printf("GlobalAlloc() 發(fā)生了如下錯(cuò)誤: %d\n",?? GetLastError());??
??????????????????? return;??
????????????? }??
????????????? else{printf("接收了一個(gè)連接\n");}
????????????? ZeroMemory(&(PerIoData->Overlapped),?? sizeof(OVERLAPPED));??
????????????? PerIoData->BytesSEND?? =?? 0;??
????????????? PerIoData->BytesRECV?? =?? 0;??
????????????? PerIoData->DataBuf.len?? =?? DATA_BUFSIZE;??
????????????? PerIoData->DataBuf.buf?? =?? PerIoData->Buffer;??
???
????????????? Flags?? =?? 0;??
????????????? if?? (WSARecv(Accept,?? &(PerIoData->DataBuf),?? 1,?? &RecvBytes,?? &Flags,??
??????????????????? &(PerIoData->Overlapped),?? NULL)?? ==?? SOCKET_ERROR)??
????????????? {??
??????????????????? if?? (WSAGetLastError()?? !=?? ERROR_IO_PENDING)??
??????????????????? {??
????????????????????????? printf("WSARecv() 發(fā)生了如下錯(cuò)誤: %d\n",?? WSAGetLastError());??
????????????????????????? return;??
??????????????????? }??
????????????? }??
??????? }??
}??
???
DWORD?? WINAPI?? ServerWorkerThread(LPVOID?? CompletionPortID)??
{??
??????? HANDLE?? CompletionPort?? =?? (HANDLE)?? CompletionPortID;??
??????? DWORD?? BytesTransferred;??
??????? LPOVERLAPPED?? Overlapped;??
??????? LPPER_HANDLE_DATA?? PerHandleData;??
??????? LPPER_IO_OPERATION_DATA?? PerIoData;??
??????? DWORD?? SendBytes,?? RecvBytes;??
??????? DWORD?? Flags;??
?????????
??????? while(TRUE)??
??????? {??
???
????????????? if?? (GetQueuedCompletionStatus(CompletionPort,?? &BytesTransferred,??
??????????????????? (LPDWORD)&PerHandleData,?? (LPOVERLAPPED?? *)?? &PerIoData,?? INFINITE)?? ==?? 0)??
????????????? {??
??????????????????? printf("GetQueuedCompletionStatus?? 發(fā)生了如下錯(cuò)誤: %d\n",?? GetLastError());??
??????????????????? return?? 0;??
????????????? }??
???
????????????? //首先檢查一下去套接字看是否在上發(fā)生了錯(cuò)誤并且如果發(fā)生了錯(cuò)誤就關(guān)閉套接
????????????? //字并且清除與套接字連接的 SOCKET_INFORMATION結(jié)構(gòu)信息體
????????????? if?? (BytesTransferred?? ==?? 0)??
????????????? {??
??????????????????? printf("正在關(guān)閉socket?? %d\n",?? PerHandleData->Socket);??
???
??????????????????? if?? (closesocket(PerHandleData->Socket)?? ==?? SOCKET_ERROR)??
??????????????????? {??
????????????????????????? printf("closesocket()?? 發(fā)生了如下錯(cuò)誤: %d\n",?? WSAGetLastError());??
????????????????????????? return?? 0;??
??????????????????? }??
???
??????????????????? GlobalFree(PerHandleData);??
??????????????????? GlobalFree(PerIoData);??
??????????????????? continue;??
????????????? }??
??? //檢查如果 BytesRECV字段等于0,這就意味著一個(gè) WSARecv調(diào)用剛剛完成了所以從完成的WSARecv()調(diào)用中
??? //用BytesTransferred值更新 BytesRECV字段
????????????? if?? (PerIoData->BytesRECV?? ==?? 0)??
????????????? {??
??????????????????? PerIoData->BytesRECV?? =?? BytesTransferred;??
??????????????????? PerIoData->BytesSEND?? =?? 0;??
????????????? }??
????????????? else??
????????????? {??
??????????????????? PerIoData->BytesSEND?? +=?? BytesTransferred;??
????????????? }??
???
????????????? if?? (PerIoData->BytesRECV?? >?? PerIoData->BytesSEND)??
????????????? {??
??? //發(fā)布另外一個(gè) WSASend()請(qǐng)求
??? //既然WSASend()不是 gauranteed去發(fā)送所有字節(jié)的請(qǐng)求
??? //繼續(xù)調(diào)用 WSASend()發(fā)送直到所有收到的字節(jié)被發(fā)送
???????????????????
??????????????????? ZeroMemory(&(PerIoData->Overlapped),?? sizeof(OVERLAPPED));??
???
??????????????????? PerIoData->DataBuf.buf?? =?? PerIoData->Buffer?? +?? PerIoData->BytesSEND;??
??????????????????? PerIoData->DataBuf.len?? =?? PerIoData->BytesRECV?? -?? PerIoData->BytesSEND;??
???
??????????????????? if?? (WSASend(PerHandleData->Socket,?? &(PerIoData->DataBuf),?? 1,?? &SendBytes,?? 0,??
????????????????????????? &(PerIoData->Overlapped),?? NULL)?? ==?? SOCKET_ERROR)??
??????????????????? {??
????????????????????????? if?? (WSAGetLastError()?? !=?? ERROR_IO_PENDING)??
????????????????????????? {??
??????????????????????????????? printf("WSASend() 發(fā)生了如下錯(cuò)誤:?? %d\n",?? WSAGetLastError());??
??????????????????????????????? return?? 0;??
????????????????????????? }??
??????????????????? }??
????????????? }??
????????????? else??
????????????? {??
??????????????????? PerIoData->BytesRECV?? =?? 0;??
??? //現(xiàn)在沒有更多的字節(jié)發(fā)送過去用來post另外一個(gè)WSARecv()請(qǐng)求
???????????????????
??????????????????? Flags?? =?? 0;??
??????????????????? ZeroMemory(&(PerIoData->Overlapped),?? sizeof(OVERLAPPED));??
???
??????????????????? PerIoData->DataBuf.len?? =?? DATA_BUFSIZE;??
??????????????????? PerIoData->DataBuf.buf?? =?? PerIoData->Buffer;??
???
??????????????????? if?? (WSARecv(PerHandleData->Socket,?? &(PerIoData->DataBuf),?? 1,?? &RecvBytes,?? &Flags,??
????????????????????????? &(PerIoData->Overlapped),?? NULL)?? ==?? SOCKET_ERROR)??
??????????????????? {??
????????????????????????? if?? (WSAGetLastError()?? !=?? ERROR_IO_PENDING)??
????????????????????????? {??
??????????????????????????????? printf("WSARecv() 發(fā)生了如下錯(cuò)誤:?? %d\n",?? WSAGetLastError());??
??????????????????????????????? return?? 0;??
????????????????????????? }??
??????????????????? }??
????????????? }??
??????? }??
}??

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美色欧美亚洲另类二区| 亚洲欧美国产三级| 亚洲精品视频免费观看| 老色批av在线精品| 一区二区高清视频在线观看| 美日韩在线观看| 久久国产主播精品| 欧美黄免费看| 亚洲欧美日本另类| 久热国产精品| 亚洲一品av免费观看| 老牛嫩草一区二区三区日本 | 亚洲国产综合91精品麻豆| 亚洲精品影视| 一本大道久久精品懂色aⅴ| 亚洲国产精品一区二区久| 久热国产精品视频| 免费观看在线综合| 欧美福利视频| 午夜在线a亚洲v天堂网2018| 亚洲盗摄视频| 国产人妖伪娘一区91| 欧美精品激情| 美女图片一区二区| 日韩一级黄色av| 91久久久在线| 亚洲一级免费视频| 国产精品青草综合久久久久99| 欧美成人免费全部观看天天性色| 欧美一区在线直播| 99av国产精品欲麻豆| 午夜欧美精品久久久久久久| 亚洲精品视频免费观看| 欧美性一区二区| 好吊色欧美一区二区三区四区| 欧美大片免费久久精品三p | 一本色道久久精品| 亚洲欧美自拍偷拍| 性色av一区二区三区红粉影视| 欧美一区二区三区免费看| 午夜精品亚洲| 日韩午夜电影| 亚洲第一二三四五区| 欧美大尺度在线观看| 欧美a级片网站| 亚洲精品网址在线观看| 欧美伊人影院| 午夜伦欧美伦电影理论片| 欧美亚洲一级| 欧美激情中文字幕乱码免费| 欧美国产精品劲爆| 伊人狠狠色j香婷婷综合| 一区二区精品在线观看| 欧美在线一区二区| 欧美高清视频一区二区三区在线观看| 噜噜噜噜噜久久久久久91| 欧美国产三区| 亚洲欧美电影在线观看| 亚洲欧美在线一区二区| 免费不卡在线观看| 国内精品嫩模av私拍在线观看| 亚洲美女黄网| 欧美二区在线播放| 欧美成人日韩| 黑人一区二区三区四区五区| 欧美一区二区三区在线| 欧美激情一区二区三区在线视频观看| 99re热这里只有精品免费视频| 亚洲综合丁香| 国产精品乱看| 中文日韩电影网站| 欧美有码视频| 欧美极品一区二区三区| 久久影视三级福利片| 日韩午夜激情av| 午夜日韩在线| 韩国女主播一区| 亚洲国产精品va在线观看黑人 | 一区二区三区黄色| 国产欧美精品va在线观看| 午夜久久资源| 亚洲毛片在线观看.| 99热免费精品在线观看| 国产欧美一区二区视频| 一区二区三区四区五区精品视频| 一区二区三区日韩欧美精品| 欧美欧美全黄| 一区二区欧美激情| 亚洲永久在线| 亚洲人成网站在线观看播放| 欧美承认网站| 国产日韩亚洲欧美精品| 麻豆精品一区二区综合av| 久热精品视频在线| 亚洲福利在线观看| 亚洲天堂成人在线观看| 在线成人免费视频| 久久久久九九视频| 一区二区三区波多野结衣在线观看| 亚洲伦理在线观看| 亚洲国产天堂久久综合| 亚洲自拍三区| 亚洲一区二区精品视频| 国产精品国产| 裸体一区二区| 99re这里只有精品6| 欧美黑人国产人伦爽爽爽| 日韩视频久久| 欧美黄色一区| 亚洲午夜国产成人av电影男同| 欧美激情亚洲综合一区| 亚洲视频专区在线| 国产精品成人va在线观看| 亚洲黄网站在线观看| 国产欧美综合在线| 久久亚洲图片| 宅男噜噜噜66一区二区66| 久久精品日韩欧美| 伊人精品成人久久综合软件| 欧美日韩国产欧| 麻豆精品视频在线观看| 欧美午夜免费| 午夜精品久久久久久久久久久| 亚洲高清三级视频| 欧美日韩国产在线播放网站| 欧美一区二区| 一区二区三区四区五区精品视频| 欧美一区二区三区成人| 国产性天天综合网| 国产日韩欧美一区二区三区在线观看 | 欧美中文在线免费| 国产精品亚洲视频| 欧美精品成人| 麻豆国产va免费精品高清在线| 一区二区欧美日韩视频| 欧美成年人网| 欧美一区二区| 亚洲一区二区三| 亚洲国产一区二区三区在线播| 国产精品都在这里| 美国成人毛片| 国产亚洲欧美一区在线观看| 美女精品在线观看| 亚洲看片一区| 日韩一级裸体免费视频| 亚洲国产精品一区二区www在线| 亚洲资源av| 亚洲日本国产| 亚洲国产精彩中文乱码av在线播放| 国产一二精品视频| 欧美福利网址| 国产精品久久久久久久久久久久 | 亚洲成人在线视频播放 | 亚洲人成77777在线观看网| 欧美视频一区二区三区| 欧美一区二区在线看| 亚洲欧美日韩在线综合| 欧美在线播放一区二区| 欧美国产三区| 国产亚洲精品久久久久久| 国产精品久久久久婷婷| 国产伦精品一区二区三区免费 | 欧美少妇一区| 黑人中文字幕一区二区三区| 一区二区福利| 美女视频黄a大片欧美| 亚洲国产精品ⅴa在线观看| 亚洲网友自拍| 亚洲电影免费观看高清| 欧美一区二区三区喷汁尤物| 久久成人免费电影| 日韩亚洲欧美高清| 麻豆精品在线视频| 很黄很黄激情成人| 亚洲欧美在线网| 亚洲国产婷婷香蕉久久久久久| 小辣椒精品导航| 免费高清在线视频一区·| 国产一区二区三区四区老人| 亚洲一卡二卡三卡四卡五卡| 亚洲性夜色噜噜噜7777| 欧美大片国产精品| 亚洲人体1000| 亚洲激情视频网站| 欧美高清在线一区| 亚洲福利视频在线| 欧美电影在线观看完整版| 欧美日韩国产免费观看| 亚洲精品国产精品乱码不99按摩| 久久天天躁狠狠躁夜夜爽蜜月| 欧美在线视频网站| 怡红院精品视频在线观看极品| 蜜桃视频一区| 欧美激情一区二区三区| 亚洲欧洲精品一区二区三区波多野1战4| 亚洲精品乱码久久久久| 亚洲性感美女99在线| 国产精品久久久久国产精品日日| 久久xxxx精品视频| 午夜精品在线看|