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

第8章Winsock I/O方法
本章重點(diǎn)是如何在Wi n d o w s套接字應(yīng)用程序中對(duì)I / O(輸入/輸出)操作進(jìn)行管理。
Wi n s o c k分別提供了“套接字模式”和“套接字I / O模型”,可對(duì)一個(gè)套接字上的I / O行為加以控制。其中,套接字模式用于決定在隨一個(gè)套接字調(diào)用時(shí),那些Wi n s o c k函數(shù)的行為。而另一方面,套接字模型描述了一個(gè)應(yīng)用程序如何對(duì)套接字上進(jìn)行的I / O進(jìn)行管理及處理。要注意的是,“套接字I / O模型”與“套接字模式”是無(wú)關(guān)的。套接字模型的出現(xiàn),正是為了解決套接字模式存在的某些限制。

Wi n s o c k提供了兩種套接字模式:鎖定和非鎖定。本章第一部分將詳細(xì)介紹這兩種模式,并闡釋一個(gè)應(yīng)用程序如何通過(guò)它們管理I / O。如大家在本章的后面部分所見,Wi n s o c k提供了一些有趣的I / O模型,有助于應(yīng)用程序通過(guò)一種“異步”方式,一次對(duì)一個(gè)或多個(gè)套接字上進(jìn)行的通信加以管理。這些模型包括s e l e c t(選擇)、W S A A s y n c S e l e c t(異步選擇)、W S A E v e n t S e l e c t
(事件選擇)、Overlapped I/O(重疊式I / O)以及Completion port(完成端口)等等。到本章結(jié)束時(shí),我們打算對(duì)各種套接字模式以及I / O模型的優(yōu)缺點(diǎn)進(jìn)行總結(jié)。同時(shí),幫助大家判斷到底哪一種最適合自己應(yīng)用程序的要求。
所有Wi n d o w s平臺(tái)都支持套接字以鎖定或非鎖定方式工作。然而,并非每種平臺(tái)都支持每一種I / O模型。如表8 - 1所示,在當(dāng)前版本的Windows CE 中,僅提供了一個(gè)I / O模型。
Windows 98和Windows 95(取決于安裝的是Winsock 1還是Winsock 2)則支持大多數(shù)I / O模型,唯一的例外便是I / O完成端口。而到了Windows NT和最新發(fā)布的Windows 2000中,每種I / O模型都是支持的。

8.1 套接字模式
就像我們前面提到的那樣, Wi n d o w s套接字在兩種模式下執(zhí)行I / O操作:鎖定和非鎖定。
在鎖定模式下,在I / O操作完成前,執(zhí)行操作的Wi n s o c k函數(shù)(比如s e n d和r e c v)會(huì)一直等候下去,不會(huì)立即返回程序(將控制權(quán)交還給程序)。而在非鎖定模式下, Wi n s o c k函數(shù)無(wú)論如何都會(huì)立即返回。在Windows CE和Windows 95(安裝Winsock 1)平臺(tái)上運(yùn)行的應(yīng)用程序僅支持極少的I / O模型,所以我們必須采取一些適當(dāng)?shù)牟襟E,讓鎖定和非鎖定套接字能夠滿足各種場(chǎng)合的要求

8.1.1 鎖定模式
對(duì)于處在鎖定模式的套接字,我們必須多加留意,因?yàn)樵谝粋€(gè)鎖定套接字上調(diào)用任何一個(gè)Winsock API函數(shù),都會(huì)產(chǎn)生相同的后果—耗費(fèi)或長(zhǎng)或短的時(shí)間“等待”。大多數(shù)Wi n s o c k應(yīng)用都是遵照一種“生產(chǎn)者-消費(fèi)者”模型來(lái)編制的。在這種模型中,應(yīng)用程序需要讀取(或?qū)懭耄┲付〝?shù)量的字節(jié),然后以它為基礎(chǔ)執(zhí)行一些計(jì)算。程序清單8 - 1展示的代碼片斷便是一個(gè)典型的例子。

// 程序清單8-1?簡(jiǎn)單的鎖定模式示例

SOCKET?s;
char ?buff[ 256 ];
int ?done? = ? 0 ;

.

while ( ! done)
{
????nBytes?
= ?recv(s,buff, 65 );
????
if (nBytes? == ?SOCKET_ERROR)
????
{
????????printf(
" recv?failed?with?error?%d " ,WSAGetLastError());
????????
return ?;????
????}

????
????
}

.


這段代碼的問(wèn)題在于,假如沒(méi)有數(shù)據(jù)處于“待決”狀態(tài),那么r e c v函數(shù)可能永遠(yuǎn)都無(wú)法返回。這是由于從語(yǔ)句可以看出:只有從系統(tǒng)的輸入緩沖區(qū)中讀回點(diǎn)什么東西,才允許返回!有些程序員可能會(huì)在r e c v中使用M S G _ P E E K標(biāo)志,或者調(diào)用i o c t l s o c k e( t 設(shè)置F I O N R E A D選項(xiàng)),
在系統(tǒng)的緩沖區(qū)中,事先“偷看”是否存在足夠的字節(jié)數(shù)量。然而,在不實(shí)際讀入數(shù)據(jù)的前提下,僅僅“偷看”數(shù)據(jù)(如實(shí)際讀入數(shù)據(jù),便會(huì)將其從系統(tǒng)緩沖區(qū)中將其刪除),可不是一件光彩的事情。我們認(rèn)為,這是一種非常不好的編程習(xí)慣,應(yīng)盡全力避免。在“偷看”的時(shí)候,對(duì)系統(tǒng)造成的開銷是極大的,因?yàn)閮H僅為了檢查有多少個(gè)字節(jié)可用,便發(fā)出一個(gè)或者更多的系統(tǒng)調(diào)用。以后,理所當(dāng)然地,還需要牽涉到進(jìn)行實(shí)際r e c v調(diào)用,將數(shù)據(jù)從系統(tǒng)緩沖區(qū)內(nèi)刪除的開銷。那么,如何避免這一情況呢?在此,我們的目標(biāo)是防止由于數(shù)據(jù)的缺乏(這
可能是網(wǎng)絡(luò)出了故障,也可能是客戶機(jī)出了問(wèn)題),造成應(yīng)用程序完全陷于“凝固”狀態(tài),同時(shí)不必連續(xù)性地檢視系統(tǒng)網(wǎng)絡(luò)緩沖!為達(dá)此目的,一個(gè)辦法是將應(yīng)用程序劃分為一個(gè)讀線程,以及一個(gè)計(jì)算線程。兩個(gè)線程都共享同一個(gè)數(shù)據(jù)緩沖區(qū)。對(duì)這個(gè)緩沖區(qū)的訪問(wèn)需要受到一定的限制,這是用一個(gè)同步對(duì)象來(lái)實(shí)現(xiàn)的,比如一個(gè)事件或者M(jìn) u t e x(互斥體)。“讀線程”的職責(zé)是從網(wǎng)絡(luò)連續(xù)地讀入數(shù)據(jù),并將其置入共享緩沖區(qū)內(nèi)。讀線程將計(jì)算線程開始工作至少需
要的數(shù)據(jù)量拿到手后,便會(huì)觸發(fā)一個(gè)事件,通知計(jì)算線程:你老兄可以開始干活了!隨后,計(jì)算線程從緩沖區(qū)取走(刪除)一個(gè)數(shù)據(jù)塊,然后進(jìn)行要求的計(jì)算。

在程序清單8 - 2中,我們分別提供了兩個(gè)函數(shù),采取的便是上述辦法。在兩個(gè)函數(shù)中,一個(gè)負(fù)責(zé)讀取網(wǎng)絡(luò)數(shù)據(jù)( R e a d T h r e a d),另一個(gè)則負(fù)責(zé)對(duì)數(shù)據(jù)執(zhí)行計(jì)算( P r o c e s s T h r e a d)。

// 程序清單8-2?多線程的鎖定套接字示例

CRITICAL_SECTION????data;
HANDLE????hEvent;
TCHAR?????buf[MAX_BUFFER_SIZE];
int ?????????nBytes;

.

// read?thread

void ?ReadThread( void )
{
????
int ?nTotal? = ? 0 ,
????????????nRead?
= ? 0 ,
????????????nLeft?
= ? 0 ,
????????????nBytes?
= ? 0 ;
????????????
????????????
while ( ! done)
????????????
{
????????????????nTotal?
= ? 0 ;
????????????????nLeft?
= ?NUM_BYTES_REQUIRED;
????????????????
while (nTotal? != ?NUM_BYTES_REQUIRED)
????????????????
{
????????????????????EnterCriticalSection(
& data);
????????????????????nRead?
= ?recv(sock, & (buff[MAX_BUFFERS_SIZE - nBytes],nLeft);
????????????????????
if (nRead? == ? - 1 )
????????????????????
{
????????????????????????printf(
" error " );
????????????????????????ExitThread();
????????????????????}

????????????????????nTotal?
+= ?nRead;
????????????????????nLeft?
-= nRead;
????????????????????
????????????????????nBytes?
+= ?nRead;
????????????????????LeaveCriticalSection(
& data);
????????????????????
????????????????}

????????????????SetEvent(hEvent);
????????????}

}


////// compution?thread

void ????ProcessThread( void )
{
????WatiForSingleObject(hEvent);
????
????EnterCriticalSection(
& data);
????..
????nBytes?
-= ?NUM_BYTES_REQUIRED;
????
????LeaveCriticalSection(
& data);
}



對(duì)鎖定套接字來(lái)說(shuō),它的一個(gè)缺點(diǎn)在于:應(yīng)用程序很難同時(shí)通過(guò)多個(gè)建好連接的套接字通信。使用前述的辦法,我們可對(duì)應(yīng)用程序進(jìn)行修改,令其為連好的每個(gè)套接字都分配一個(gè)讀線程,以及一個(gè)數(shù)據(jù)處理線程。盡管這仍然會(huì)增大一些開銷,但的確是一種可行的方案。唯一的缺點(diǎn)便是擴(kuò)展性極差,以后想同時(shí)處理大量套接字時(shí),恐怕難以下手。
Posted on 2006-09-11 17:48 艾凡赫 閱讀(641) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 網(wǎng)絡(luò)編程
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲中午字幕| 国产日韩精品一区| 亚洲福利在线观看| 久久天堂精品| 免费观看成人www动漫视频| 亚洲激情婷婷| 亚洲青色在线| 欧美视频你懂的| 久久激情五月丁香伊人| 裸体一区二区三区| 亚洲一区bb| 欧美影院午夜播放| 亚洲美女av黄| 亚洲综合99| 91久久中文| 亚洲在线1234| 亚洲国产精品小视频| 一区二区三区精品国产| 国产日韩在线视频| 91久久精品网| 国产午夜精品在线观看| 亚洲高清不卡在线| 国产区日韩欧美| 亚洲高清视频在线| 国产日本精品| 亚洲免费观看高清在线观看| 国产一区二区你懂的| 亚洲国产另类久久久精品极度 | 男男成人高潮片免费网站| 欧美国产日本| 久久蜜臀精品av| 欧美网站在线观看| 欧美激情一区二区三区蜜桃视频| 国产精品视频精品| 亚洲日韩第九十九页| 亚洲精品黄网在线观看| 国产日韩专区在线| 亚洲视频国产视频| 亚洲剧情一区二区| 久久视频一区二区| 久久久91精品国产一区二区三区 | 国产亚洲一区在线播放| 日韩视频永久免费观看| 亚洲人成网站精品片在线观看| 亚洲男人第一网站| 亚洲综合日本| 欧美日韩国产在线观看| 欧美激情一区二区| 激情综合亚洲| 亚洲综合首页| 亚洲欧美一区二区三区久久| 欧美日产国产成人免费图片| 免费观看在线综合色| 国产综合视频| 欧美一区二区三区男人的天堂 | 一区二区精品在线| 欧美激情 亚洲a∨综合| 国产午夜精品全部视频在线播放| 亚洲综合色网站| 欧美激情无毛| 91久久精品一区| 99在线精品视频| 欧美日本高清| 一区二区三区精品国产| 制服丝袜亚洲播放| 欧美性猛交视频| 亚洲一本视频| 久久精品国产综合精品| 国内视频一区| 欧美成人精品不卡视频在线观看 | 亚洲国产成人精品视频| 亚洲精品久久久蜜桃| 麻豆国产精品一区二区三区| 欧美高清视频一区| 亚洲精品专区| 国产精品99一区| 午夜久久电影网| 巨乳诱惑日韩免费av| 亚洲国产日韩欧美在线动漫| 欧美国产三区| 亚洲视频一区二区| 久久久综合网站| 亚洲精品视频在线| 国产精品成av人在线视午夜片| 亚洲一区二区高清视频| 久久天天躁狠狠躁夜夜爽蜜月 | 国语自产精品视频在线看8查询8| 久久久久国色av免费看影院 | 亚洲激情在线观看| 久久久久久亚洲精品不卡4k岛国| 欧美国产极速在线| 亚洲欧美视频在线| 悠悠资源网久久精品| 欧美日本成人| 久久国产日韩欧美| 亚洲美女精品一区| 老牛嫩草一区二区三区日本| 日韩午夜精品| 韩日精品在线| 欧美午夜电影一区| 老巨人导航500精品| 一区二区免费在线视频| 久久夜色精品国产欧美乱极品| 日韩视频在线免费| 国产真实久久| 欧美视频在线观看| 蜜臀99久久精品久久久久久软件| 夜夜夜精品看看| 欧美大尺度在线| 久久国产免费| 亚洲欧美国产77777| 亚洲韩国精品一区| 国产亚洲精品久久久久婷婷瑜伽| 欧美成人精品在线播放| 欧美在线视频导航| 亚洲无线一线二线三线区别av| 欧美激情一区二区三区高清视频| 欧美在线视频a| 亚洲一区二区免费视频| 日韩视频永久免费观看| 在线观看国产欧美| 国产在线视频欧美一区二区三区| 欧美阿v一级看视频| 久久女同精品一区二区| 亚洲电影免费观看高清完整版在线 | 亚洲欧美日韩中文播放| 99精品国产在热久久婷婷| 亚洲丶国产丶欧美一区二区三区| 国产人久久人人人人爽| 国产精品色网| 国产精品国产三级国产专区53 | 久久手机免费观看| 久久精品国产一区二区三区| 午夜精品久久久久| 亚洲欧美日韩一区二区三区在线观看 | 在线视频国内自拍亚洲视频| 国产日韩精品视频一区| 国产精品嫩草影院一区二区| 欧美视频中文一区二区三区在线观看| 欧美精品国产精品| 欧美黑人多人双交| 欧美精品国产| 欧美日韩一区二区在线视频 | 香蕉久久一区二区不卡无毒影院| 亚洲视频欧美视频| 午夜国产欧美理论在线播放| 亚洲免费一级电影| 亚洲视频网在线直播| 亚洲视频在线观看一区| 亚洲少妇最新在线视频| 亚洲一区影院| 久久er精品视频| 久久综合激情| 亚洲春色另类小说| 亚洲人妖在线| 亚洲桃花岛网站| 欧美一级在线视频| 久久亚洲二区| 欧美另类女人| 国产女人aaa级久久久级| 国产综合av| 亚洲精品免费观看| 亚洲一区二区三区在线看| 午夜精品久久久久久久久久久| 久久av最新网址| 亚洲成色精品| 亚洲一区二区三区四区五区黄| 亚洲欧美中文日韩v在线观看| 久久国产手机看片| 欧美久久久久中文字幕| 国产精品一区免费在线观看| 激情婷婷亚洲| 亚洲午夜视频在线| 久久伊人精品天天| 亚洲精品视频在线观看网站| 亚洲自拍偷拍福利| 欧美成人精品在线播放| 国产精品亚洲精品| 亚洲欧洲美洲综合色网| 销魂美女一区二区三区视频在线| 久久综合九色综合久99| 日韩亚洲在线| 免费高清在线一区| 国产精品夜夜夜一区二区三区尤| 亚洲二区免费| 亚洲欧美日韩国产一区二区| 亚洲成在线观看| 亚洲欧美日韩国产中文在线| 欧美激情视频网站| 一区二区三区在线观看视频| 亚洲一区二区av电影| 欧美国产日本高清在线| 亚洲国产成人在线播放| 久久九九久精品国产免费直播| 欧美成人精品一区二区三区| 亚洲午夜国产一区99re久久| 欧美国产视频在线| 亚洲国产高清自拍| 久久精品夜色噜噜亚洲a∨| 一本色道久久加勒比88综合|