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

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

Wi n s o c k提供了兩種套接字模式:鎖定和非鎖定。本章第一部分將詳細介紹這兩種模式,并闡釋一個應用程序如何通過它們管理I / O。如大家在本章的后面部分所見,Wi n s o c k提供了一些有趣的I / O模型,有助于應用程序通過一種“異步”方式,一次對一個或多個套接字上進行的通信加以管理。這些模型包括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(完成端口)等等。到本章結束時,我們打算對各種套接字模式以及I / O模型的優缺點進行總結。同時,幫助大家判斷到底哪一種最適合自己應用程序的要求。
所有Wi n d o w s平臺都支持套接字以鎖定或非鎖定方式工作。然而,并非每種平臺都支持每一種I / O模型。如表8 - 1所示,在當前版本的Windows CE 中,僅提供了一個I / O模型。
Windows 98和Windows 95(取決于安裝的是Winsock 1還是Winsock 2)則支持大多數I / O模型,唯一的例外便是I / O完成端口。而到了Windows NT和最新發布的Windows 2000中,每種I / O模型都是支持的。

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

8.1.1 鎖定模式
對于處在鎖定模式的套接字,我們必須多加留意,因為在一個鎖定套接字上調用任何一個Winsock API函數,都會產生相同的后果—耗費或長或短的時間“等待”。大多數Wi n s o c k應用都是遵照一種“生產者-消費者”模型來編制的。在這種模型中,應用程序需要讀取(或寫入)指定數量的字節,然后以它為基礎執行一些計算。程序清單8 - 1展示的代碼片斷便是一個典型的例子。

// 程序清單8-1?簡單的鎖定模式示例

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 ?;????
????}

????
????
}

.


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

在程序清單8 - 2中,我們分別提供了兩個函數,采取的便是上述辦法。在兩個函數中,一個負責讀取網絡數據( R e a d T h r e a d),另一個則負責對數據執行計算( 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);
}



對鎖定套接字來說,它的一個缺點在于:應用程序很難同時通過多個建好連接的套接字通信。使用前述的辦法,我們可對應用程序進行修改,令其為連好的每個套接字都分配一個讀線程,以及一個數據處理線程。盡管這仍然會增大一些開銷,但的確是一種可行的方案。唯一的缺點便是擴展性極差,以后想同時處理大量套接字時,恐怕難以下手。
Posted on 2006-09-11 17:48 艾凡赫 閱讀(647) 評論(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在线| 最新亚洲一区| 欧美日韩精品一区二区天天拍小说| 亚洲国产精品99久久久久久久久| 亚洲国产精品高清久久久| 久久一区二区三区av| 免费在线看成人av| 蜜桃av噜噜一区二区三区| 亚洲精品免费电影| 黄色一区二区在线观看| 国产精品美女久久久免费 | 亚洲国产一成人久久精品| 国产日韩欧美在线一区| 欧美日韩一视频区二区| 亚洲一区二区三区四区五区黄| 亚洲图片欧洲图片av| 欧美日本一区| 99re6热只有精品免费观看| 99视频精品全部免费在线| 欧美人交a欧美精品| 亚洲美女免费精品视频在线观看| 一区二区三区鲁丝不卡| 国产精品麻豆欧美日韩ww| 午夜精品久久久| 麻豆成人小视频| 日韩视频在线免费| 欧美午夜www高清视频| 亚洲一区在线播放| 久久亚洲电影| 一本不卡影院| 国产日韩精品一区| 久久躁日日躁aaaaxxxx| 99re国产精品| 久久久夜精品| 夜夜嗨网站十八久久| 国产精品女人久久久久久| 久久九九精品99国产精品| 91久久久久久| 久久国产婷婷国产香蕉| 亚洲卡通欧美制服中文| 国产乱肥老妇国产一区二| 久久日韩粉嫩一区二区三区| 日韩一级裸体免费视频| 看片网站欧美日韩| 在线一区二区日韩| 曰韩精品一区二区| 欧美亚一区二区| 蜜桃视频一区| 欧美在线观看视频| 亚洲最黄网站| 亚洲国产精品久久91精品| 亚洲欧美国产毛片在线| 亚洲福利视频二区| 国产精品午夜视频| 欧美高清在线播放| 欧美在线综合视频| 亚洲深夜福利网站| 亚洲第一精品夜夜躁人人爽 | 欧美视频中文一区二区三区在线观看 | 午夜精品久久久久久久99水蜜桃| 一区二区在线视频观看| 国产精品一区一区三区| 欧美激情亚洲自拍| 久久久久久网| 欧美一区二区黄色| 亚洲图片激情小说| 亚洲激情国产精品| 欧美高清在线视频观看不卡| 欧美激情精品久久久久| 欧美亚洲一区二区三区| 日韩视频在线观看| 欧美午夜不卡| 欧美一区精品| 麻豆乱码国产一区二区三区| 永久免费视频成人| 男女激情久久| 欧美日韩一区二区在线| 久久国产免费| 亚洲无人区一区| 最新国产拍偷乱拍精品| 在线观看国产成人av片| 国内精品视频在线观看| 国产日韩欧美一区在线| 国产精品美女诱惑| 国产精品扒开腿爽爽爽视频| 欧美色另类天堂2015| 欧美日韩综合视频| 欧美日韩视频不卡| 欧美系列亚洲系列| 欧美午夜久久久| 国产精品免费视频观看| 国产精品免费一区二区三区观看| 国产精品国色综合久久| 国产精品欧美日韩| 国产乱码精品一区二区三区忘忧草| 国产精品白丝av嫩草影院| 国产精品成人一区二区艾草| 国产精品成人免费视频| 国产精品久久久久久久午夜 | 另类成人小视频在线| 久久蜜臀精品av| 欧美aⅴ99久久黑人专区| 欧美日韩国产首页| 国产精品麻豆va在线播放| 国产亚洲一区在线播放| 在线看国产一区| 99视频在线观看一区三区| 亚洲欧美国产精品桃花| 久久九九久精品国产免费直播| 另类国产ts人妖高潮视频| 亚洲国产精品久久精品怡红院| 99综合在线| 性欧美18~19sex高清播放| 久久婷婷国产麻豆91天堂| 欧美日韩国产综合新一区| 国产美女精品免费电影| 亚洲激情成人| 亚洲一区久久久| 性欧美在线看片a免费观看| 欧美尤物一区| 99视频日韩| 在线观看欧美视频| 欧美午夜一区| 快射av在线播放一区| 欧美精品二区| 国产性做久久久久久| 亚洲福利视频免费观看| 国产精品99久久久久久宅男 | 先锋a资源在线看亚洲| 浪潮色综合久久天堂| 欧美日韩中文在线| 亚洲午夜电影网| 久久aⅴ国产紧身牛仔裤| 亚洲乱码久久| 久久婷婷蜜乳一本欲蜜臀| 91久久国产综合久久蜜月精品 | 国语自产精品视频在线看抢先版结局| 久久久久88色偷偷免费| 亚洲国产综合91精品麻豆| 欧美成人乱码一区二区三区| 欧美一区二区成人| 欧美精品 国产精品| 国产精品亚洲一区二区三区在线| 亚洲国产精品久久精品怡红院| 亚洲欧美日韩在线一区| 亚洲激情视频网站| 欧美专区第一页| 国产精品欧美一区喷水| 亚洲欧洲综合另类在线| 久久躁狠狠躁夜夜爽| 亚洲图片在区色| 欧美日韩成人在线观看| 亚洲高清资源| 卡一卡二国产精品| 午夜精品在线视频| 国产精品久久久久久亚洲毛片 | 亚洲欧美日韩综合| 亚洲国产乱码最新视频| 久久亚洲捆绑美女| 国产一区二区三区丝袜| 亚洲欧美成aⅴ人在线观看| 亚洲精品综合在线| 欧美激情中文不卡| 亚洲人精品午夜| 亚洲国产mv| 欧美1区3d| 亚洲精品国产精品乱码不99 | 国产精品一区在线观看| 亚洲欧美成人在线| av不卡免费看| 欧美成人精品高清在线播放| 国产日本欧美一区二区三区| 黄色一区二区在线| 久久久亚洲一区| 久久久久久久综合狠狠综合| 狠狠噜噜久久|