• <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>

            ?3. recv和W S A R e c v
            對在已連接套接字上接受接入數據來說, r e c v函數是最基本的方式。它的定義如下:

            int recv(
            ?????SOCKET s,
            ?????char FAR * buf,
            ?????int len,
            ?????int flags
            ????);
            第一個參數s,是準備接收數據的那個套接字。第二個參數b u f,是即將收到數據的字符緩沖,而l e n則是準備接收的字節數或b u f緩沖的長度。最后, f l a g s參數可以是下面的值: 0、M S G _ P E E K或M S G _ O O B。另外,還可對這些標志中的每一個進行按位和運算。當然, 0表示無特殊行為。M S G _ P E E K會使有用的數據復制到所提供的接收端緩沖內,但是沒有從系統緩
            沖中將它刪除。另外,還返回了待發字節數。
            消息取數不太好。它不僅導致性能下降(因為需要進行兩次系統調用,一次是取數,另一次是無M S G _ P E E K標志的真正刪除數據的調用),在某些情況下還可能不可靠。返回的數據可能沒有反射出真正有用的數量。與此同時,把數據留在系統緩沖,可容納接入數據的系統空間就會越來越少。其結果便是,系統減少各發送端的T C P窗口容量。由此,你的應用就不能獲得最大的流通。最好是把所有數據都復制到自己的緩沖中,并在那里計算數據。前面曾介紹過M S G _ O O B標志。有關詳情,參見前面“帶外數據”的內容。

            在面向消息或面向數據報的套接字上使用r e c v時,這幾點應該注意。在待發數據大于所提供的緩沖這一事件中,緩沖內會盡量地填充數據。這時, r e c v調用就會產生W S A E M S G S I Z E錯誤。注意,消息長錯誤是在使用面向消息的協議時發生的。流協議把接入的數據緩存下來,
            并盡量地返回應用所要求的數據,即使待發數據的數量比緩沖大。因此,對流式傳輸協議來說,就不會碰到W S A E M S G S I Z E這個錯誤。
            W S A R e c v函數在r e c v的基礎上增加了一些新特性。比如說重疊I / O和部分數據報通知。
            W S A R e c v的定義如下:

            int WSARecv(
            ???????SOCKET?s,
            ???????LPWSABUF lpBuffers,
            ???????DWORD?? dwBufferCount,
            ???????LPWORD? lpNumberOfBytesRecved,
            ???????LPWSAOVERLAPPED?lpOverlapped,
            ???????LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionROUTINE
            ??????);
            ??????
            參數s,是已建立連接的套接字。第二和第三個參數是接收數據的緩沖。l p B u ff e r s參數是一個W S A B U F結構組成的數組,而d w B u ff e r C o u n t則表明前一個數組中W S A B U F結構的數目。
            如果接收操作立即完成, l p N u m b e r O f B y t e s R e c e i v e d參數就會指向執行這個函數調用所收到的字節數。l p F l a g s參數可以是下面任何一個值: M S G _ P E E K、M S G _ O O B、M S G _ PA RT I A L或者對這些值進行按位和運算之后的結果。M S G _ PA RT I A L標志使用和出現的地方不同,其含
            義也不同。對面向消息的協議來說,這個標志是W S A R e c v調用返回后設置的(如果因為緩沖空間不夠導致整條消息未能在這次調用中返回的話)。這時,后面的W S A R e c v調用就會設置這個標志M A S G _ PA RT I A L,直到整條消息返回,才把這個標志清除。如果這個標志當作一個輸入參數投遞,接收操作應該在一收到數據就結束,即使它收到的只是整條消息中的一部分。
            M S G _ PA RT I A L標志只隨面向消息的協議一起使用。每個協議的協議條目都包含一個標志,表明是否支持這一特性。有關詳情,參見第5章。l p O v e r l a p p e d和l p C o m p l e t i o n R O U T I N E參數用于重疊I / O操作

            4. WSARecvDisconnect
            這函數與W S A S e n d D i s c o n n e c t函數對應,其定義如下:
            int WSARecvDisconnect(?
            ????????????SOCKET s,
            ????????????LPWSABUF lpOUTboundDisconnectData
            ???????????);
            和W S A S e n d D i s c o n n e c t函數的參數一樣,該函數的參數也是已建立連接的套接字句柄和
            一個有效的W S A B U F結構(帶有收到的數據)。收到的數據可以只是斷開數據。這個斷開數據是另一端執行W S A S e n d D i s c o n n e c t調用發出的,它不能用于接收普通數據。另外,一旦收到這個數據, W S A R e c v D i s c o n n e c t函數就會取消接收遠程通信方的數據,其作用和調用帶有S D _ R E C V的s h u t d o w n函數相同。
            5. WSARecvEx
            W S A R e c v E x函數是微軟專有的Winsock 1擴展,除了f l a g s參數是按值引用外,其余和r e c v函數是一樣的。它允許基層的提供者設置M S G _ PA RT I A L標志。該函數的原型如下:

            int PASCAL FAR WSARecvEx(
            ?????????????SOCKET s,
            ?????????????char FAR * buf,
            ?????????????int len,
            ?????????????int * flags
            ????????????);
            ????????????


            如果收到的數據不是一條完整的消息, f l a g s參數中就會返回M S G _ PA RT I A L標志。對面向消息的協議(即非流協議)來說,這個標志比較有用(即非流協議)。在M S G _ PA RT I A L標志被當作f l a g s參數的一部分投遞,而且收到的消息又不完整時,調用W S A R e c v E x,就會立即
            返回收到的那個數據。如果提供的接收緩沖容納不下整條消息, W S A R e c v E x就會失敗,并出現W S A E M S G S I Z E 錯誤,剩下的數據也會被截掉。注意, M S G _ PA RT I A L 標志和W S A E M S G S I Z E錯誤之間的確區別是:有了這個錯誤,即使整條消息到達接收端,但由于提
            供的數據緩沖太少,也不能對它進行接收。M S G _ P E E K 和M S G _ O O B標志還可以和W S A R e c v E x一起使用。

            Posted on 2006-09-07 22:32 艾凡赫 閱讀(865) 評論(2)  編輯 收藏 引用 所屬分類: 基礎知識網絡編程

            Feedback

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

            2006-09-07 22:04 by 愛飯盒
            測試

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

            2011-06-08 11:59 by 外網
            @愛飯盒
            萬維網
            97久久超碰国产精品2021| 久久高潮一级毛片免费| 久久久久se色偷偷亚洲精品av| 亚洲精品无码久久不卡| 久久九九久精品国产免费直播| 777午夜精品久久av蜜臀 | 亚洲精品国产美女久久久| 久久久久久国产精品免费无码 | 人人狠狠综合久久亚洲高清| 久久人妻无码中文字幕| 18岁日韩内射颜射午夜久久成人| 无码乱码观看精品久久| 国内精品久久久人妻中文字幕| 久久久久亚洲爆乳少妇无| 久久久久亚洲AV片无码下载蜜桃 | 亚洲综合精品香蕉久久网97| 亚洲美日韩Av中文字幕无码久久久妻妇 | 亚洲欧美一区二区三区久久| 久久精品国产亚洲欧美| 欧美一区二区三区久久综合 | 少妇人妻综合久久中文字幕| 日本久久久久久中文字幕| 一本色综合网久久| 久久天天躁狠狠躁夜夜不卡| 国产99久久久国产精免费| 亚洲精品tv久久久久久久久| 久久AAAA片一区二区| 国产成人久久精品一区二区三区 | 国产偷久久久精品专区| 久久国产成人亚洲精品影院| 精品久久久噜噜噜久久久| 久久精品国产久精国产一老狼| 香蕉久久影院| 亚洲精品97久久中文字幕无码| 久久精品无码免费不卡| 97精品国产97久久久久久免费| 亚洲一区二区三区日本久久九| 老司机国内精品久久久久| 精品午夜久久福利大片| 久久91精品国产91久久户| 久久综合九色综合欧美狠狠|