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

牽著老婆滿街逛

嚴以律己,寬以待人. 三思而后行.
GMail/GTalk: yanglinbo#google.com;
MSN/Email: tx7do#yahoo.com.cn;
QQ: 3 0 3 3 9 6 9 2 0 .

iocp進行SOCKET通信(轉載)

轉載于hxzb7215191 的BLOG

當然TCP方式的模型還有事件選擇模型。
就是把所有的網絡事件和我們的一個程序里定義的事件梆定。
這個有它的好處,可能可以讓我們更好的寫一個線程來管理
接收與發送。
現在來講一下一個完成端口模型。

? 完成端口
?
?一個完成端口其實就是一個通知隊列,由操作系統把已經完成的重疊I/O請求的通知
?放入其中。當某項I/O操作一旦完成,某個可以對該操作結果進行處理的工作者線程
?就會收到一則通知。而套接字在被創建后,可以在任何時候與某個完成端口進行關
?聯。
?
?步驟:
?1、創建一個空的完成端口;
?2、得到本地機器的CPU個數;
?3、開啟CPU*2個工作線程(又名線程池),全部都在等待完成端口的完成包;
?4、創建TCP的監聽socket,使用事件邦定,創建監聽線程;
?5、當有人連接進入的時候,將Client socket保存到一個我們自己定義的關鍵鍵,
??? 并把它與我們創建的完成端口關聯;
?6、使用WSARecv和WSASend函數投遞一些請求,這是使用重疊I/O的方式;
?7、重復5~6;

?注:1、重疊I/O的方式中,接收與發送數據包的時候,一定要進行投遞請求這是
???它們這個體系結構的特點
???當然,在完成端口方式中,不是直接使用的WSARecv和WSASend函數進行請求
???的投遞的。而是使用的ReadFile,Write的方式
??2、完成端口使用了系統內部的一些模型,所以我們只要按照一定的順序調用就
???可以完成了。
??3、完成端口是使用在這樣的情況下,有成千上萬的用戶連接的時候,它能夠
???保證性能不會降低。


?

#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);

void ?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?failed?with?error?%d\n " ,?Ret);
??????
return ;
???}


???
// 打開一個空的完成端口

???
if ?((CompletionPort? = ?CreateIoCompletionPort(INVALID_HANDLE_VALUE,?NULL,? 0 ,? 0 ))? == ?NULL)
???
{
??????printf(?
" CreateIoCompletionPort?failed?with?error:?%d\n " ,?GetLastError());
??????
return ;
???}


???
// ?Determine?how?many?processors?are?on?the?system.

???GetSystemInfo(
& SystemInfo);

???
// ?開啟cpu個數的2倍個的線程

???
for (i? = ? 0 ;?i? < ?SystemInfo.dwNumberOfProcessors? * ? 2 ;?i ++ )
???
{
??????HANDLE?ThreadHandle;

??????
// ?Create?a?server?worker?thread?and?pass?the?completion?port?to?the?thread.

??????
if ?((ThreadHandle? = ?CreateThread(NULL,? 0 ,?ServerWorkerThread,?CompletionPort,
?????????
0 ,? & ThreadID))? == ?NULL)
??????
{
?????????printf(
" CreateThread()?failed?with?error?%d\n " ,?GetLastError());
?????????
return ;
??????}


??????
// ?Close?the?thread?handle
??????CloseHandle(ThreadHandle);
???}


???
// 打開一個服務器socket

???
if ?((Listen? = ?WSASocket(AF_INET,?SOCK_STREAM,? 0 ,?NULL,? 0 ,
??????WSA_FLAG_OVERLAPPED))?
== ?INVALID_SOCKET)
???
{
??????printf(
" WSASocket()?failed?with?error?%d\n " ,?WSAGetLastError());
??????
return ;
???}
?

???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()?failed?with?error?%d\n " ,?WSAGetLastError());
??????
return ;
???}



???
if ?(listen(Listen,? 5 )? == ?SOCKET_ERROR)
???
{
??????printf(
" listen()?failed?with?error?%d\n " ,?WSAGetLastError());
??????
return ;
???}


???
// 開始接收從客戶端來的連接

???
while (TRUE)
???
{
??????
if ?((Accept? = ?WSAAccept(Listen,?NULL,?NULL,?NULL,? 0 ))? == ?SOCKET_ERROR)
??????
{
?????????printf(
" WSAAccept()?failed?with?error?%d\n " ,?WSAGetLastError());
?????????
return ;
??????}


??????
// ?創建一個關鍵項用于保存這個客戶端的信息,用戶接收發送的重疊結構,
??????
// ?還有使用到的緩沖區
?????? if ?((PerHandleData? = ?(LPPER_HANDLE_DATA)?GlobalAlloc(GPTR,?
?????????
sizeof (PER_HANDLE_DATA)))? == ?NULL)
??????
{
?????????printf(
" GlobalAlloc()?failed?with?error?%d\n " ,?GetLastError());
?????????
return ;
??????}


??????
// ?Associate?the?accepted?socket?with?the?original?completion?port.

??????printf(
" Socket?number?%d?connected\n " ,?Accept);
??????PerHandleData
-> Socket? = ?Accept;

??????
// 與我們的創建的那個完成端口關聯起來,將關鍵項也與指定的一個完成端口關聯
?????? if ?(CreateIoCompletionPort((HANDLE)?Accept,?CompletionPort,?(DWORD)?PerHandleData,
?????????
0 )? == ?NULL)
??????
{
?????????printf(
" CreateIoCompletionPort?failed?with?error?%d\n " ,?GetLastError());
?????????
return ;
??????}


??????
// ?投遞一次接收,由于接收都需要使用這個函數來投遞一個接收的準備

??????
if ?((PerIoData? = ?(LPPER_IO_OPERATION_DATA)?GlobalAlloc(GPTR,?????????? sizeof (PER_IO_OPERATION_DATA)))? == ?NULL)
??????
{
?????????printf(
" GlobalAlloc()?failed?with?error?%d\n " ,?GetLastError());
?????????
return ;
??????}


??????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()?failed?with?error?%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?failed?with?error?%d\n " ,?GetLastError());
?????????
return ? 0 ;
??????}



??????
// 是不是有人退出了

??????
if ?(BytesTransferred? == ? 0 )
??????
{
?????????printf(
" Closing?socket?%d\n " ,?PerHandleData -> Socket);

?????????
if ?(closesocket(PerHandleData -> Socket)? == ?SOCKET_ERROR)
?????????
{
????????????printf(
" closesocket()?failed?with?error?%d\n " ,?WSAGetLastError());
????????????
return ? 0 ;
?????????}


?????????GlobalFree(PerHandleData);
?????????GlobalFree(PerIoData);
?????????
continue ;
??????}


??????
//

??????
if ?(PerIoData -> BytesRECV? == ? 0 )
??????
{
?????????PerIoData
-> BytesRECV? = ?BytesTransferred;
?????????PerIoData
-> BytesSEND? = ? 0 ;
??????}

??????
else
??????
{
?????????PerIoData
-> BytesSEND? += ?BytesTransferred;
??????}


??????
if ?(PerIoData -> BytesRECV? > ?PerIoData -> BytesSEND)
??????
{

?????????
// ?Post?another?WSASend()?request.
?????????
// ?Since?WSASend()?is?not?gauranteed?to?send?all?of?the?bytes?requested,
?????????
// ?continue?posting?WSASend()?calls?until?all?received?bytes?are?sent.

?????????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()?failed?with?error?%d\n " ,?WSAGetLastError());
???????????????
return ? 0 ;
????????????}

?????????}

??????}

??????
else
??????
{
?????????PerIoData
-> BytesRECV? = ? 0 ;

?????????
// ?Now?that?there?are?no?more?bytes?to?send?post?another?WSARecv()?request.

?????????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()?failed?with?error?%d\n " ,?WSAGetLastError());
???????????????
return ? 0 ;
????????????}

?????????}

??????}

???}

}

posted on 2006-07-07 12:03 楊粼波 閱讀(3664) 評論(4)  編輯 收藏 引用 所屬分類: 網絡編程

評論

# re: iocp進行SOCKET通信(轉載) 2007-03-12 14:57 lodzio

http://www.tope-pelose.lavoro-di-piede.info @X@   回復  更多評論   

# re: iocp進行SOCKET通信(轉載) 2008-03-22 10:30 郝翰霖

請問大蝦這代碼是如何格式化的?
如何讓html仍然按C風格顯示?  回復  更多評論   

# re: iocp進行SOCKET通信(轉載) 2009-12-29 23:32 人生如戲

您好,我正在學習這方面的知識。。。希望得到更進一步的學習。。。希望得到您的幫助。。如果有可能請您給我發一份代碼到我的郵箱里面吧。注釋不注釋無所謂啦。。。當然有更好啦。。謝謝!x8990253@126.com  回復  更多評論   

# re: iocp進行SOCKET通信(轉載) 2010-04-09 17:49 圣神之光

這里的話應該是接收到數據就傳回給客戶端吧?
請問如果服務器端接收到數據以后需要處理的話線程需要如何處理?
GetQueuedCompletionStatus接收到的是否是一個完整的數據呢?
最近正在學習這個,請大蝦賜教
回復郵箱:jingamesave@163.com
  回復  更多評論   

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美成人精品h版在线观看| 亚洲一区久久久| 嫩草国产精品入口| 久久精品视频一| 亚洲国产欧美一区| 亚洲人成艺术| 国产精品www| 久久精品在线观看| 久久精品在线观看| 亚洲精品日韩在线| 国产午夜亚洲精品羞羞网站| 亚洲国产高清在线| 欧美 日韩 国产 一区| 日韩午夜av| 一区二区三区黄色| 国产午夜精品视频免费不卡69堂| 久久久久久午夜| 欧美极品一区| 欧美一二三区精品| 老司机aⅴ在线精品导航| 亚洲精品乱码久久久久久久久 | 欧美日韩高清在线观看| 宅男噜噜噜66一区二区66| 亚洲欧美日韩精品| 亚洲国产精品久久久久秋霞不卡 | 久久精品免费播放| 免费日韩av| 先锋资源久久| 免费中文日韩| 久久成人免费电影| 久久久久久夜精品精品免费| 一区二区三区国产精品| 久久精品国产清自在天天线| av成人免费观看| 久久精品亚洲乱码伦伦中文| 亚洲一区二区av电影| 亚洲欧洲另类国产综合| 亚洲最新在线| 亚洲激情成人网| 午夜精品国产精品大乳美女| 99热免费精品| 久久婷婷成人综合色| 香蕉乱码成人久久天堂爱免费| 欧美69wwwcom| 裸体素人女欧美日韩| 国产精品无人区| 亚洲免费观看高清完整版在线观看熊| 狠狠色香婷婷久久亚洲精品| 亚洲一区日韩在线| 亚洲视频图片小说| 欧美精品激情| 亚洲国产欧美一区二区三区同亚洲| 国产亚洲精品成人av久久ww| 宅男精品视频| 亚洲午夜精品一区二区| 欧美激情亚洲自拍| 亚洲国产精品传媒在线观看| 一区二区三区中文在线观看| 久久se精品一区二区| 欧美在线视频全部完| 国产精品色在线| 一区二区三区久久网| 亚洲一区自拍| 国产精品大片免费观看| 一二三区精品| 亚洲男同1069视频| 国产精品国产三级国产aⅴ9色 | 99re在线精品| 欧美久久久久久久久| 亚洲国产成人久久综合| 亚洲精品国产拍免费91在线| 欧美jizz19性欧美| 亚洲国产高潮在线观看| 亚洲美女精品久久| 欧美精品在线播放| 99热在这里有精品免费| 亚洲欧美一区二区三区极速播放 | 国产日产欧美a一级在线| 亚洲欧美日韩综合| 久热成人在线视频| 亚洲第一黄色| 欧美日韩国产一中文字不卡| 一本大道久久a久久精二百| 亚洲欧美国产一区二区三区| 国产精品自拍小视频| 欧美资源在线| 亚洲欧洲一级| 午夜影院日韩| 亚洲高清中文字幕| 欧美日韩第一区| 亚洲综合社区| 蜜臀久久99精品久久久画质超高清| 亚洲靠逼com| 国产农村妇女毛片精品久久麻豆 | 伊人久久噜噜噜躁狠狠躁| 欧美aⅴ一区二区三区视频| 亚洲精品色婷婷福利天堂| 欧美一区二区视频免费观看| 在线观看三级视频欧美| 欧美日韩亚洲91| 久久国产精品第一页| 亚洲精品极品| 久久久亚洲欧洲日产国码αv| 亚洲精品国产日韩| 国产日韩欧美高清免费| 欧美福利一区二区三区| 午夜激情综合网| 亚洲国产专区| 久久久综合激的五月天| 中文无字幕一区二区三区| 黄色免费成人| 国产精品盗摄久久久| 欧美高清在线视频| 欧美一区二区三区日韩| 亚洲精品久久在线| 蜜月aⅴ免费一区二区三区 | 一本一本久久a久久精品牛牛影视| 国产亚洲欧美一区| 欧美三级视频在线观看| 老司机成人网| 久久gogo国模裸体人体| 亚洲图中文字幕| 日韩亚洲精品视频| 欧美国产精品日韩| 久久理论片午夜琪琪电影网| 亚洲欧美日本日韩| 99伊人成综合| 亚洲区中文字幕| 亚洲第一视频| 欧美激情按摩| 亚洲国产精品综合| 国产亚洲欧美在线| 国产精品你懂的在线| 牛夜精品久久久久久久99黑人 | 香蕉视频成人在线观看| 一区二区三区四区国产| 亚洲欧洲另类国产综合| 欧美激情中文字幕一区二区| 牛牛国产精品| 欧美寡妇偷汉性猛交| 免费看的黄色欧美网站| 老司机亚洲精品| 久久天天综合| 模特精品裸拍一区| 欧美 日韩 国产一区二区在线视频| 久久男人资源视频| 久久久久久久久久久一区| 久久精品视频在线观看| 久久国产视频网| 久久影院午夜论| 久久亚洲美女| 欧美韩国一区| 91久久夜色精品国产九色| 最近中文字幕日韩精品| 亚洲精品一区二区三区四区高清| 亚洲三级毛片| 亚洲午夜黄色| 久久不射2019中文字幕| 久久久精品一区| 欧美jizzhd精品欧美巨大免费| 欧美另类极品videosbest最新版本| 欧美激情国产高清| 国产精品久久午夜夜伦鲁鲁| 国产精品美女久久| 黑丝一区二区| 99视频一区二区| 欧美一区二区成人| 老司机一区二区三区| 亚洲欧洲另类国产综合| 亚洲制服丝袜在线| 久久久女女女女999久久| 欧美精品九九99久久| 国产精品网曝门| 亚洲第一区色| 亚洲欧美伊人| 欧美成人情趣视频| 亚洲视频免费观看| 久久在线免费观看| 国产精品va在线| …久久精品99久久香蕉国产| 一区二区三区精品| 久久久999精品免费| 亚洲精品少妇网址| 欧美一区二区三区喷汁尤物| 欧美激情亚洲激情| 黄色精品一区| 亚洲欧美成人在线| 欧美激情自拍| 欧美在线视频一区二区| 欧美日韩国产成人高清视频| 国产自产高清不卡| 亚洲一区在线直播| 欧美黄色影院| 久久成人亚洲| 国产精品久久久久久久久久久久久久| 精品不卡在线| 欧美一级片在线播放| 亚洲美女免费视频| 欧美福利电影网| 精品999在线播放|