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

7.4.3 基于消息的協議
正由于面向連接的協議同時也是流式協議,無連接協議幾乎都是基于消息的。因此,在收發數據時,需要考慮這幾點。首先,由于面向消息的協議對數據邊界有保護,所以提交給發送函數的數據在被發送完之前累積成塊。對異步或非塊式I / O模式而言,如果數據未能完全發送,發送函數就會返回W S A E W O U L D B L O C K錯誤。這意味著基層的系統不能對不完整的那個數據進行處理,你應該稍后再次調用發送函數。下一章將對此進行詳述。主要需要記住
的是,采用基于消息的協議時,對于寫入數據來說,只能把它當作一個自治行為。
在連接另一端,對接收函數的調用必須提供一個足夠大的緩沖空間。如果提供的緩沖不夠,接收調用就會失敗,出現W S A E M S G S I Z E。發生這種情況時,緩沖會盡力接收,但未收完的數據會被丟棄。被截斷的數據無法恢復。唯一例外的是支持部分消息的協議卻例外,比方說A p p l e Talk PA P協議。在W S A R e c v E x函數只收到部分消息時,它會在返回之前,便把自
己的出入標志參數設為M S G _ PA RT I A L。
對以支持部分消息的協議為基礎的數據報來說,可考慮使用一個W S A R e c v函數。在調用r e c v時,不會有這一個通知“讀取的數據只是消息的一部分”。至于接收端怎樣判斷是否已讀取整條消息,具體方法則由程序員決定。后來的r e c v調用返回這個數據報的其他部分。由于有這個限制,所以利用W S A R e c v E x函數非常方便,它允許設置和讀取M S G _ PA RT I A L標志

M S G _ PA RT I A L標志指明整條消息是否已讀取。Winsock 2函數W S A R e c v和W S A R e c v F r o m也支持這一標志。關于這個標志的更多知識,請參見對W S A R e c v、W S A R e c v E x和W S A R e c v F r o m
這三個函數的描述。
我們最后要談的便是在有多個網絡接口的機器上發送UDP /IP消息。這方面的問題頗多,
我們來看一個最常見的問題:在一個U D P套接字明顯綁定到一個本地I P接口和發送數據報時,會發生什么情況? U D P套接字并不會真正和網絡接口綁定在一起。而是建立一種聯系,即綁定的I P接口成為發出去的U D P數據報的源I P地址。路由表才真正決定數據報在哪個物理接口上傳出去。如果不調用b i n d,而是先調用s e n d t o或W S A S e n d To執行連接,網絡堆棧就會根據
路由表,自動選出最佳本地I P地址。這意味著;如果你先執行明顯綁定,源I P地址就會有誤。
也就是說,源I P可能不是真正在它上面發送數據報的那個接口的I P地址。
7.4.4 釋放套接字資源
因為無連接協議沒有連接,所以也不會有正式的關閉和從容關閉。在接收端或發送端結束收發數據時,它只是在套接字句柄上調用c l o s e s o c k e t函數。這樣,便釋放了為套接字分配的
所有相關資源。
7.4.5 綜合分析
對于在無連接的套接字上收發數據的步驟,大家現在已經很清楚了。接下來,我們來看看執行這一進程的代碼。程序清單7 - 3展示了一個無連接的接收端。這段代碼說明了如何在默認接口或指定的本地接口上接收數據報。

7.5 其他API函數
本小節介紹其他幾個Winsock API函數,它們在實際網絡應用中非常有用
1. getpeername
該函數用于獲得通信方的套接字地址信息,該信息是關于已建立連接的那個套接字的。
它的定義如下:
int getpeername(
????????SOCKET s,
????????struct sockaddr FAR * name,
????????int FAR *namelen
???????);
第一個參數是準備連接的套接字,后兩個參數則是指向基層協議類型及其長度的指針。
對數據報套接字來說,這個函數返回的是投向連接調用的那個地址;但不會返回投向s e n d t o或W S A S e n d To調用的那個地址。

2. getsockname
該函數是g e t s o c k n a m e的對應函數。它返回的是指定套接字的本地接口的地址信息。它的定義如下:

int getsockname(
????????SOCKET s,
????????struct sockaddr FAR * name,
????????int FAR *namelen
???????);
?除了套接字s返回的地址信息本地地址信息外,它的參數和g e t p e e r n a m e的參數都是一樣的。
T C P協議中,這個地址和監聽指定端口和I P接口的那個服務器套接字是一樣的。
3. WSADuplicateSocket
W S A D u p l i c a t e S o c k e t函數用來建立W S A P R O TO C O L _ I N F O結構,該結構可投入另一個進程,這樣就可用另一個進程打開一個指向同一個基層套接字的句柄,如此一來,另一個進程也能對該資源進行操作。注意,這一點只適用于兩個進程之間;同一個進程中的線程可自由投遞套接字描述符。該函數的定義如下:

int WSADuplicateSocket(
????????????SOCKET s,
????????????DWORD dwProcessId,
????????????LPWSAPROTOCOL_INFO?lpProtocol
???????????);
第一個參數是準備復制的套接字句柄。第二個參數d w P r o c e s s I d,是打算使用復制套接字的進程之I D。第三個參數l p P r o t o c o l I n f o,是一個指向W S A P R O TO C O L _ I N F O結構的指針,將包含目標進程打開復制句柄時所需的信息。為了使目前的進程能夠把W S A P R O TO C O L _ I N F O
結構投到目標進程,然后再利用該結構建立一個指向指定套接字的句柄(利用W S A S o c k e t函數),必須考慮進程間通信。
兩個套接字的描述符都可獨立使用I / O;但Wi n s o c k沒有提供訪問控制,因此這要由程序員決定是否執行同步。所有描述符中都可見到關聯到一個套接字的所有狀態信息,這是因為復制的是套接字描述符,而不是事實上的套接字。比方說,對于描述符上由s e t s o c k e t o p t函數設置的任何一個套接字選項,都可通過任何一個或所有描述符利用g e t s o c k o p t函數來看它們。
如果一個進程在一個復制套接字上調用c l o s e s o c k e t,就會導致該進程中的描述符變成解除定位;但在最后留下的那個描述符上調用c l o s e s o c k e 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時,要了解與共享套接字的通知有關的幾個問題。這兩個函數用于異步I / O(我們將在第8章進行討論)。利用任何一個共享描述符執行前兩個函數的調用,都會刪掉所有的套接字事件注冊,不管注冊所用的描述符究竟是哪一
個。例如,共享套接字不能把F D _ R E A D事件投遞給進程A,不能把F D _ W R I T E投遞給進程B。
如果需要這兩個描述符的事件通知,就應該重新設計應用程序,用線程來代替進程。

4. Tr a n s m i t F i l e
Tr a n s m i t F i l e是微軟專有的Wi n s o c k擴展,它允許從一個文件中傳輸高性能數據。這是非常有效的,因為整個數據傳輸可在內核模式中進行。也就是說,如果你的應用從指定的文件中讀取一堆數據,然后用s e n d或W S A S e n d時,涉及到“用戶模式到內核模式傳輸”的發送調用就有若干個。有了Tr a n s m i t F i l e,整個讀取和發送數據的進程就可在內核模式中進行。該函
數的定義如下:

BOOL? TransmitFile(
??????????SOCKET hSocket,
??????????HANDLE hFile,
??????????DWORD ?nNumberOfBytesToWrite,
??????????DWORD??nNumberOfBytesPerSend,
??????????LPOVERLAPPED?lpOverlapped,
??????????LPTRANMIT_FILE_BUFFERS ?lpTransmitBuffers,
??????????DWORD dwFlags
?????????);
h S o c k e t參數用于識別已連接上的套接字(文件的傳輸便在該套接字上進行)。n F i l e參數是一個句柄,該句柄指向一個已打開的套接字(即即將發送的文件)。n N u m b e r O f B y t e s To Wr i t e表
明寫入多少指定文件中的字節。投遞0表示將發送整個文件。n N u m b e r O f B y t e s P e r S e n d參數則表明寫操作所用的發送長度。例如,指定2 0 4 8會引起Tr a n s m i t F i l e在套接字上以2 KB數據塊的形
式發送指定文件。投遞0表示采用默認的發送長度。l p O v e r l a p p e d參數指定一個O V E R L A P P E D
結構,該結構用于重疊I / O模式(關于重疊I / O,可參見第8章)。
另一個參數l p Tr a n s m i t B u ff e r s,是一個T R A N S M I T _ F I L E _ B U F F E R S結構,其中包含文件傳輸之前和之后準備發送的數據。該結構的格式如下:

typedef struct _TANSMIT_FILE_BUFFERS{
?PVOID?Head;
?DWORD HeadLenth;
?PVOID Tail;
?DWORD TailLength;
?}TAANSMIT_FILE_BUFFERS;?????
?
?H e a d字段是一個指針,它指向文件傳輸之前準備發送的數據。H e a d L e n g t h表明預先準備發送的數據量。Ta i l字段則指向文件傳輸之后準備發送的數據。Ta i l L e n g t h是后來發送的數據量。??????????

Posted on 2006-09-11 17:20 艾凡赫 閱讀(849) 評論(1)  編輯 收藏 引用 所屬分類: 網絡編程

Feedback

# re: windows網絡編程十二  回復  更多評論   

2008-01-26 20:11 by 舞天
暈暈的~~
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            国产自产精品| 国产欧美二区| 久久三级福利| 免费观看成人鲁鲁鲁鲁鲁视频| 国产日韩精品在线播放| 一区二区在线观看视频在线观看| 亚洲一区三区在线观看| 欧美三级视频| 国产一区在线看| 久久综合一区二区| 亚洲国产高清高潮精品美女| 欧美四级在线| 欧美一区二区视频在线观看| 欧美1区2区| 亚洲一区二区在线视频| 久久久久久综合网天天| 欧美婷婷久久| 久久九九99视频| 一本色道久久综合精品竹菊| 久久久久久久一区二区| 亚洲开发第一视频在线播放| 久久精品国产一区二区电影 | 在线综合欧美| 欧美成人r级一区二区三区| 国产日本欧美一区二区| 久久九九国产精品怡红院| 欧美国产亚洲另类动漫| 狠狠久久婷婷| 久久久亚洲欧洲日产国码αv| 久久免费视频在线观看| 欧美高清在线视频| 久久久久99| 欧美三级电影网| 欧美不卡福利| 国产视频一区二区在线观看| 最近中文字幕日韩精品| 久久综合九色九九| 好看的日韩av电影| 中日韩在线视频| 亚洲人成在线观看| 亚洲高清资源| 国内精品视频在线播放| 亚洲影院免费| 亚洲一区二区在线| 欧美日本高清视频| 99国内精品久久| 99ri日韩精品视频| 国产精品ⅴa在线观看h| 午夜精彩国产免费不卡不顿大片| 久久av一区二区三区漫画| 亚洲午夜一区| 一区二区三区在线高清| 日韩午夜黄色| 国产网站欧美日韩免费精品在线观看| 午夜欧美大片免费观看| 欧美极品在线播放| 亚洲一二三区在线观看| 一区二区三区视频观看| 99re热这里只有精品视频 | 亚洲欧美日韩一区在线观看| 一区二区三区不卡视频在线观看 | 亚洲精品久久久久久久久久久| 国产亚洲欧美日韩美女| 欧美一区不卡| 国产精品嫩草影院av蜜臀| 亚洲午夜国产成人av电影男同| 亚洲欧洲精品一区二区三区波多野1战4| 久久在线免费| 免费在线观看精品| 欧美日韩精品一本二本三本| 小黄鸭精品密入口导航| 久久久久国产精品一区| 久久久999精品免费| 国产手机视频一区二区| 欧美在线关看| 日韩一级成人av| 欧美人体xx| 亚洲一区二区在线播放| 久久av一区二区| 娇妻被交换粗又大又硬视频欧美| 亚洲国产精品久久| 国产精品乱码久久久久久| 亚洲专区免费| 亚洲精品美女久久久久| 欧美精品综合| 午夜精品区一区二区三| 亚洲日本成人在线观看| 欧美日本中文字幕| 亚洲免费一在线| 免费的成人av| 中日韩男男gay无套| 欧美成人一区二区| 一本久久综合亚洲鲁鲁| 久久aⅴ乱码一区二区三区| 亚洲高清网站| 欧美在线一级视频| 亚洲激情网站| 久久av在线| 日韩系列在线| 国内精品伊人久久久久av影院| 在线一区二区三区四区五区| 久久福利影视| 99re在线精品| 国产日韩专区在线| 欧美激情视频一区二区三区免费| 久久国产天堂福利天堂| 亚洲国产天堂网精品网站| 久久久精品免费视频| 久久成人一区| 99国产精品99久久久久久| 国产精品日韩欧美| 亚洲在线观看| 亚洲美女黄网| 亚洲一区二区三区精品在线观看 | 日韩亚洲欧美一区二区三区| 午夜电影亚洲| 一区二区三区国产盗摄| 欧美日本高清一区| 久久婷婷国产综合精品青草| 亚洲天堂男人| 亚洲精品久久久久久一区二区| 国产精品三区www17con| 奶水喷射视频一区| 亚洲免费视频观看| 一区二区三区欧美在线观看| 欧美国产一区在线| 一本色道久久99精品综合| 欧美人成在线| 欧美h视频在线| 久久精品视频免费观看| 香蕉成人伊视频在线观看| 欧美日韩亚洲国产精品| 99re6这里只有精品视频在线观看| 亚洲国产精品va在线看黑人动漫 | 在线视频一区观看| 麻豆精品精华液| 久久亚洲国产成人| 亚洲日产国产精品| 亚洲东热激情| 亚洲国产视频一区| 亚洲黄色天堂| 日韩视频国产视频| 夜久久久久久| 中文在线不卡视频| 亚洲欧美精品伊人久久| 亚洲欧美精品在线观看| 亚洲制服av| 欧美影院成人| 久久免费视频网| 美国十次成人| 亚洲二区免费| 99国产成+人+综合+亚洲欧美| 久久精品国产96久久久香蕉| 午夜精品久久久久久久蜜桃app| 国内成人精品一区| 亚洲国产女人aaa毛片在线| 在线精品观看| 国产欧美日韩一区二区三区在线| 久久综合久久久久88| 久久久国产一区二区三区| 久久全国免费视频| 欧美乱在线观看| 国产精品jizz在线观看美国| 国产精品一区视频网站| 美女主播视频一区| 欧美一区二区三区精品电影| 99视频超级精品| 亚洲欧美影院| 夜夜嗨av一区二区三区四区 | 午夜在线一区| 久久久午夜精品| 亚洲日本在线观看| 亚洲一区二区三区精品在线观看 | 欧美一区亚洲二区| 女生裸体视频一区二区三区| 亚洲国产精品免费| 亚洲欧美精品中文字幕在线| 麻豆精品视频在线| 国产精品嫩草久久久久| 影音先锋亚洲视频| 国产亚洲精品bt天堂精选| 伊人成人网在线看| 亚洲一区二区三区在线视频| 久久精品一区二区三区不卡| 亚洲国产精品成人精品| 亚洲在线成人| 欧美日本一道本| 1024日韩| 欧美一级片一区| 最新亚洲激情| 久久久之久亚州精品露出| 欧美视频一区二区三区…| 影音先锋久久精品| 亚洲影视中文字幕| 亚洲黄色性网站| 久久精品亚洲乱码伦伦中文 | 亚洲欧美在线一区| 欧美激情一区二区三区在线| 国产日韩精品一区观看| 亚洲一本视频|