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

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

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

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

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

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

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

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擴(kuò)展,它允許從一個文件中傳輸高性能數(shù)據(jù)。這是非常有效的,因?yàn)檎麄€數(shù)據(jù)傳輸可在內(nèi)核模式中進(jìn)行。也就是說,如果你的應(yīng)用從指定的文件中讀取一堆數(shù)據(jù),然后用s e n d或W S A S e n d時,涉及到“用戶模式到內(nèi)核模式傳輸”的發(fā)送調(diào)用就有若干個。有了Tr a n s m i t F i l e,整個讀取和發(fā)送數(shù)據(jù)的進(jìn)程就可在內(nèi)核模式中進(jìn)行。該函
數(shù)的定義如下:

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參數(shù)用于識別已連接上的套接字(文件的傳輸便在該套接字上進(jìn)行)。n F i l e參數(shù)是一個句柄,該句柄指向一個已打開的套接字(即即將發(fā)送的文件)。n N u m b e r O f B y t e s To Wr i t e表
明寫入多少指定文件中的字節(jié)。投遞0表示將發(fā)送整個文件。n N u m b e r O f B y t e s P e r S e n d參數(shù)則表明寫操作所用的發(fā)送長度。例如,指定2 0 4 8會引起Tr a n s m i t F i l e在套接字上以2 KB數(shù)據(jù)塊的形
式發(fā)送指定文件。投遞0表示采用默認(rèn)的發(fā)送長度。l p O v e r l a p p e d參數(shù)指定一個O V E R L A P P E D
結(jié)構(gòu),該結(jié)構(gòu)用于重疊I / O模式(關(guān)于重疊I / O,可參見第8章)。
另一個參數(shù)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結(jié)構(gòu),其中包含文件傳輸之前和之后準(zhǔn)備發(fā)送的數(shù)據(jù)。該結(jié)構(gòu)的格式如下:

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

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

Feedback

# re: windows網(wǎng)絡(luò)編程十二  回復(fù)  更多評論   

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>
            亚洲国产精品福利| 亚洲国产婷婷综合在线精品 | 久久久91精品国产| 国产在线高清精品| 欧美成人国产一区二区| 另类天堂av| 在线一区二区三区四区| 亚洲综合色视频| 国产主播喷水一区二区| 欧美国产一区二区在线观看| 欧美经典一区二区三区| 亚洲香蕉在线观看| 欧美在线视频网站| 亚洲精品乱码| 亚洲一区日韩在线| 亚洲国产精品久久久久秋霞影院| 亚洲三级观看| 国产深夜精品福利| 亚洲第一黄网| 国产精品网曝门| 欧美激情精品久久久久久蜜臀| 欧美日韩亚洲一区在线观看| 久久天天躁狠狠躁夜夜av| 欧美大学生性色视频| 午夜精品久久久久久久久久久| 久久国产直播| 亚洲综合首页| 暖暖成人免费视频| 久久精品午夜| 国产精品国产三级国产aⅴ无密码| 久久九九热re6这里有精品| 欧美国产精品人人做人人爱| 欧美在线亚洲在线| 欧美日韩黄色大片| 欧美国产日韩在线| 国产一区二区三区不卡在线观看 | 久久综合一区二区三区| 欧美婷婷久久| 欧美电影在线观看| 国产日韩三区| 亚洲午夜在线视频| 日韩午夜三级在线| 免费观看欧美在线视频的网站| 亚洲欧美激情一区| 欧美日韩高清在线观看| 欧美伊人久久久久久久久影院| 亚洲人成在线观看| 国产精品伦一区| 91久久黄色| 在线日韩中文字幕| 欧美在线观看视频一区二区三区| 亚洲网在线观看| 欧美—级a级欧美特级ar全黄| 老司机精品久久| 国模精品一区二区三区| 亚洲欧美三级在线| 性色av一区二区三区在线观看 | 日韩一区二区精品| 亚洲精品你懂的| 美女主播精品视频一二三四| 另类尿喷潮videofree| 精久久久久久| 久久人人爽人人爽| 欧美成人综合网站| 亚洲三级观看| 欧美精品久久久久a| 亚洲剧情一区二区| 亚洲一区二区三区四区五区午夜| 欧美精品久久99| av不卡在线观看| 亚洲男人第一网站| 国产区精品视频| 久久国产日韩| 亚洲大片精品永久免费| 9人人澡人人爽人人精品| 欧美日韩国产首页在线观看| 99精品欧美| 久久国产一区| 亚洲国产婷婷香蕉久久久久久99| 女女同性精品视频| 一区二区三区精品视频| 午夜精品成人在线视频| 国产午夜精品一区二区三区视频| 久久国产精品色婷婷| 亚洲第一页中文字幕| 在线视频日韩| 国产亚洲精品aa| 欧美77777| 亚洲一区精彩视频| 欧美福利一区二区三区| 在线亚洲一区观看| 国产自产精品| 欧美日韩成人一区二区三区| 亚洲一区在线免费| 欧美成人在线免费视频| 亚洲制服丝袜在线| 精品999在线播放| 欧美日韩日日夜夜| 久久久www成人免费无遮挡大片| 欧美激情一区二区三区在线视频观看 | 亚洲综合视频在线| 亚洲风情亚aⅴ在线发布| 亚洲欧美日韩在线播放| 亚洲国产精品久久久久久女王| 欧美天天在线| 在线观看不卡| 欧美日韩亚洲一区| 久久中文久久字幕| 亚洲欧美国产视频| 欧美α欧美αv大片| 亚洲欧美日韩国产综合在线| 91久久国产综合久久| 国产农村妇女毛片精品久久莱园子| 久久综合一区| 欧美一区二区三区啪啪| 亚洲精选在线| 欧美黄色大片网站| 久久香蕉精品| 欧美亚洲视频在线看网址| 99国产精品久久久| 亚洲国产欧美不卡在线观看| 国产午夜精品久久久| 国产精品久久激情| 欧美日韩国产影片| 男人天堂欧美日韩| 美女国产一区| 久久久久久久成人| 久久国产精品72免费观看| 亚洲一区二区三区在线观看视频| 亚洲激情网站| 最新成人在线| 亚洲国产成人午夜在线一区| 蜜臀av一级做a爰片久久| 久久青草欧美一区二区三区| 欧美制服丝袜| 久久国产直播| 久久久久久久久一区二区| 欧美影院视频| 久久久久成人精品| 久久亚洲图片| 蜜桃视频一区| 亚洲第一精品夜夜躁人人爽| 欧美成人免费网站| 亚洲成人资源| 亚洲成色777777女色窝| 亚洲激情在线观看| 亚洲激情一区二区三区| 99视频+国产日韩欧美| 99精品视频一区二区三区| 中文网丁香综合网| 亚洲免费一区二区| 久久av资源网站| 久久在线免费观看视频| 欧美大片在线看| 欧美三区视频| 国产日韩在线看片| 在线看日韩欧美| 9l国产精品久久久久麻豆| 亚洲伊人伊色伊影伊综合网| 欧美一区二区私人影院日本 | 久久综合999| 亚洲国产欧美在线| 日韩视频永久免费观看| 亚洲一区二区精品视频| 久久精品二区三区| 欧美多人爱爱视频网站| 国产精品久久久久aaaa九色| 国产三级精品三级| 日韩午夜中文字幕| 香蕉免费一区二区三区在线观看| 久久香蕉国产线看观看av| 亚洲人成人99网站| 亚洲欧美日韩一区二区三区在线观看| 欧美一区二粉嫩精品国产一线天| 裸体素人女欧美日韩| 欧美视频日韩视频| 影音先锋日韩精品| 亚洲视频在线观看网站| 久久婷婷蜜乳一本欲蜜臀| 亚洲经典视频在线观看| 欧美亚洲尤物久久| 欧美精品123区| 精品成人国产| 午夜欧美大尺度福利影院在线看| 欧美精品日韩三级| 国产精品日韩欧美综合| 亚洲日本va午夜在线影院| 亚洲欧美偷拍卡通变态| 欧美黄色片免费观看| 亚洲永久字幕| 欧美激情免费在线| 伊人久久亚洲影院| 久久国产一区| 一区二区三区产品免费精品久久75| 久久精品国产亚洲aⅴ| 国产精品美女久久久久久免费| 亚洲精品久久嫩草网站秘色 | 亚洲欧美日韩精品| 亚洲日韩视频| 欧美成人日本|