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

posts - 297,  comments - 15,  trackbacks - 0


Linux
下getsockopt/setsockopt 函數(shù)說明
【getsockopt/setsockopt系統(tǒng)調(diào)用】  
   
功能描述:
        獲取或者設置與某個套接字關(guān)聯(lián)的選 項。選項可能存在于多層協(xié)議中,它們總會出現(xiàn)在最上面的套接字層。當操作套接字選項時,選項位于的層和選項的名稱必須給出。為了操作套接字層的選項,應該 將層的值指定為SOL_SOCKET。為了操作其它層的選項,控制選項的合適協(xié)議號必須給出。例如,為了表示一個選項由TCP協(xié)議解析,層應該設定為協(xié)議 號TCP。


用法:
#include <sys/types.h>
#include <sys/socket.h>

int getsockopt(int sock, int level, int optname, void *optval, socklen_t *optlen);

int setsockopt(int sock, int level, int optname, const void *optval, socklen_t optlen);

參數(shù):  
sock:將要被設置或者獲取選項的套接字。
level:選項所在的協(xié)議層。
optname:需要訪問的選項名。
optval:對于getsockopt(),指向返回選項值的緩沖。對于setsockopt(),指向包含新選項值的緩沖。
optlen:對于getsockopt(),作為入口參數(shù)時,選項值的最大長度。作為出口參數(shù)時,選項值的實際長度。對于setsockopt(),現(xiàn)選項的長度。


返回說明:  


成功執(zhí)行時,返回0。失敗返回-1,errno被設為以下的某個值  
EBADF:sock不是有效的文件描述詞
EFAULT:optval指向的內(nèi)存并非有效的進程空間
EINVAL:在調(diào)用setsockopt()時,optlen無效
ENOPROTOOPT:指定的協(xié)議層不能識別選項
ENOTSOCK:sock描述的不是套接字


參數(shù)詳細說明:

level指定控制套接字的層次.可以取三種值:
1)SOL_SOCKET:通用套接字選項.
2)IPPROTO_IP:IP選項.
3)IPPROTO_TCP:TCP選項. 
optname指定控制的方式(選項的名稱),我們下面詳細解釋 

optval獲得或者是設置套接字選項.根據(jù)選項名稱的數(shù)據(jù)類型進行轉(zhuǎn)換 


選項名稱        說明                  數(shù)據(jù)類型
========================================================================
            SOL_SOCKET
------------------------------------------------------------------------
SO_BROADCAST      允許發(fā)送廣播數(shù)據(jù)            int
SO_DEBUG        允許調(diào)試                int
SO_DONTROUTE      不查找路由               int
SO_ERROR        獲得套接字錯誤             int
SO_KEEPALIVE      保持連接                int
SO_LINGER        延遲關(guān)閉連接              struct linger
SO_OOBINLINE      帶外數(shù)據(jù)放入正常數(shù)據(jù)流         int
SO_RCVBUF        接收緩沖區(qū)大小             int
SO_SNDBUF        發(fā)送緩沖區(qū)大小             int
SO_RCVLOWAT       接收緩沖區(qū)下限             int
SO_SNDLOWAT       發(fā)送緩沖區(qū)下限             int
SO_RCVTIMEO       接收超時                struct timeval
SO_SNDTIMEO       發(fā)送超時                struct timeval
SO_REUSERADDR      允許重用本地地址和端口         int
SO_TYPE         獲得套接字類型             int
SO_BSDCOMPAT      與BSD系統(tǒng)兼容              int
========================================================================
            IPPROTO_IP
------------------------------------------------------------------------
IP_HDRINCL       在數(shù)據(jù)包中包含IP首部          int
IP_OPTINOS       IP首部選項               int
IP_TOS         服務類型
IP_TTL         生存時間                int
========================================================================
            IPPRO_TCP
------------------------------------------------------------------------
TCP_MAXSEG       TCP最大數(shù)據(jù)段的大小           int
TCP_NODELAY       不使用Nagle算法             int
========================================================================

返回說明:  
成功執(zhí)行時,返回0。失敗返回-1,errno被設為以下的某個值  
EBADF:sock不是有效的文件描述詞
EFAULT:optval指向的內(nèi)存并非有效的進程空間
EINVAL:在調(diào)用setsockopt()時,optlen無效
ENOPROTOOPT:指定的協(xié)議層不能識別選項
ENOTSOCK:sock描述的不是套接字

SO_RCVBUF和SO_SNDBUF每個套接口都有一個發(fā)送緩沖區(qū)和一個接收緩沖區(qū),使用這兩個套接口選項可以改變?nèi)笔【彌_區(qū)大小。

// 接收緩沖區(qū)
int nRecvBuf=32*1024;         //設置為32K
setsockopt(s,SOL_SOCKET,SO_RCVBUF,(const char*)&nRecvBuf,sizeof(int));


//發(fā)送緩沖區(qū)
int nSendBuf=32*1024;//設置為32K
setsockopt(s,SOL_SOCKET,SO_SNDBUF,(const char*)&nSendBuf,sizeof(int));

注意:

        當設置TCP套接口接收緩沖區(qū)的大小時,函數(shù)調(diào)用順序是很重要的,因為TCP的窗口規(guī)模選項是在建立連接時用SYN與對方互換得到的。對于客戶,O_RCVBUF選項必須在connect之前設置;對于服務器,SO_RCVBUF選項必須在listen前設置。

結(jié)合原理說明:

        1.每個套接口都有一個發(fā)送緩沖區(qū)和一個接收緩沖區(qū)。 接收緩沖區(qū)被TCP和UDP用來將接收到的數(shù)據(jù)一直保存到由應用進程來讀。 TCP:TCP通告另一端的窗口大小。 TCP套接口接收緩沖區(qū)不可能溢出,因為對方不允許發(fā)出超過所通告窗口大小的數(shù)據(jù)。 這就是TCP的流量控制,如果對方無視窗口大小而發(fā)出了超過窗口大小的數(shù)據(jù),則接 收方TCP將丟棄它。 UDP:當接收到的數(shù)據(jù)報裝不進套接口接收緩沖區(qū)時,此數(shù)據(jù)報就被丟棄。UDP是沒有流量控制的;快的發(fā)送者可以很容易地就淹沒慢的接收者,導致接收方的UDP丟棄數(shù)據(jù)報。
        2.我們經(jīng)常聽說tcp協(xié)議的三次握手,但三次握手到底是什么,其細節(jié)是什么,為什么要這么做呢?
        第一次:客戶端發(fā)送連接請求給服務器,服務器接收;
        第二次:服務器返回給客戶端一個確認碼,附帶一個從服務器到客戶端的連接請求,客戶機接收,確認客戶端到服務器的連接.
        第三次:客戶機返回服務器上次發(fā)送請求的確認碼,服務器接收,確認服務器到客戶端的連接.
        我們可以看到:
        1. tcp的每個連接都需要確認.
        2. 客戶端到服務器和服務器到客戶端的連接是獨立的.
        我們再想想tcp協(xié)議的特點:連接的,可靠的,全雙工的,實際上tcp的三次握手正是為了保證這些特性的實現(xiàn).


        3.setsockopt的用法

1.closesocket(一般不會立即關(guān)閉而經(jīng)歷TIME_WAIT的過程)后想繼續(xù)重用該socket:
BOOL bReuseaddr=TRUE;
setsockopt(s,SOL_SOCKET ,SO_REUSEADDR,(const char*)&bReuseaddr,sizeof(BOOL));


2. 如果要已經(jīng)處于連接狀態(tài)的soket在調(diào)用closesocket后強制關(guān)閉,不經(jīng)歷TIME_WAIT的過程:
BOOL bDontLinger = FALSE;
setsockopt(s,SOL_SOCKET,SO_DONTLINGER,(const char*)&bDontLinger,sizeof(BOOL));


3.在send(),recv()過程中有時由于網(wǎng)絡狀況等原因,發(fā)收不能預期進行,而設置收發(fā)時限:
int nNetTimeout=1000;//1秒
//發(fā)送時限
setsockopt(socket,SOL_S0CKET,SO_SNDTIMEO,(char *)&nNetTimeout,sizeof(int));
//接收時限
setsockopt(socket,SOL_S0CKET,SO_RCVTIMEO,(char *)&nNetTimeout,sizeof(int));


4.在send()的時候,返回的是實際發(fā)送出去的字節(jié)(同步)或發(fā)送到socket緩沖區(qū)的字節(jié)
(異步);系統(tǒng)默認的狀態(tài)發(fā)送和接收一次為8688字節(jié)(約為8.5K);在實際的過程中發(fā)送數(shù)據(jù)
和接收數(shù)據(jù)量比較大,可以設置socket緩沖區(qū),而避免了send(),recv()不斷的循環(huán)收發(fā):
// 接收緩沖區(qū)
int nRecvBuf=32*1024;//設置為32K
setsockopt(s,SOL_SOCKET,SO_RCVBUF,(const char*)&nRecvBuf,sizeof(int));
//發(fā)送緩沖區(qū)
int nSendBuf=32*1024;//設置為32K
setsockopt(s,SOL_SOCKET,SO_SNDBUF,(const char*)&nSendBuf,sizeof(int));


5. 如果在發(fā)送數(shù)據(jù)的時,希望不經(jīng)歷由系統(tǒng)緩沖區(qū)到socket緩沖區(qū)的拷貝而影響
程序的性能:
int nZero=0;
setsockopt(socket,SOL_S0CKET,SO_SNDBUF,(char *)&nZero,sizeof(nZero));


6.同上在recv()完成上述功能(默認情況是將socket緩沖區(qū)的內(nèi)容拷貝到系統(tǒng)緩沖區(qū)):
int nZero=0;
setsockopt(socket,SOL_S0CKET,SO_RCVBUF,(char *)&nZero,sizeof(int));


7.一般在發(fā)送UDP數(shù)據(jù)報的時候,希望該socket發(fā)送的數(shù)據(jù)具有廣播特性:
BOOL bBroadcast=TRUE;
setsockopt(s,SOL_SOCKET,SO_BROADCAST,(const char*)&bBroadcast,sizeof(BOOL));


8.在client連接服務器過程中,如果處于非阻塞模式下的socket在connect()的過程中可以設置connect()延時,直到accpet()被呼叫(本函數(shù)設置只有在非阻塞的過程中有顯著的作用,在阻塞的函數(shù)調(diào)用中作用不大)
BOOL bConditionalAccept=TRUE;
setsockopt(s,SOL_SOCKET,SO_CONDITIONAL_ACCEPT,(const char*)&bConditionalAccept,sizeof(BOOL));


9.如果在發(fā)送數(shù)據(jù)的過程中(send()沒有完成,還有數(shù)據(jù)沒發(fā)送)而調(diào)用了closesocket(),以前我們一般采取的措施是"從容關(guān)閉"shutdown(s,SD_BOTH),但是數(shù)據(jù)是肯定丟失了,如何設置讓程序滿足具體應用的要求(即讓沒發(fā)完的數(shù)據(jù)發(fā)送出去后在關(guān)閉socket)?
struct linger {
u_short l_onoff;
u_short l_linger;
};
linger m_sLinger;
m_sLinger.l_onoff=1;//(在closesocket()調(diào)用,但是還有數(shù)據(jù)沒發(fā)送完畢的時候容許逗留)
// 如果m_sLinger.l_onoff=0;則功能和2.)作用相同;
m_sLinger.l_linger=5;//(容許逗留的時間為5秒)
setsockopt(s,SOL_SOCKET,SO_LINGER,(const char*)&m_sLinger,sizeof(linger));

 

轉(zhuǎn)載出處:http://blog.csdn.net/chinafe/archive/2008/12/15/3517537.aspx
轉(zhuǎn)載出處:http://blog.csdn.net/xioahw/archive/2009/04/08/4056514.aspx

posted on 2010-09-06 11:17 chatler 閱讀(719) 評論(0)  編輯 收藏 引用 所屬分類: Socket
<2010年2月>
31123456
78910111213
14151617181920
21222324252627
28123456
78910111213

常用鏈接

留言簿(10)

隨筆分類(307)

隨筆檔案(297)

algorithm

Books_Free_Online

C++

database

Linux

Linux shell

linux socket

misce

  • cloudward
  • 感覺這個博客還是不錯,雖然做的東西和我不大相關(guān),覺得看看還是有好處的

network

OSS

  • Google Android
  • Android is a software stack for mobile devices that includes an operating system, middleware and key applications. This early look at the Android SDK provides the tools and APIs necessary to begin developing applications on the Android platform using the Java programming language.
  • os161 file list

overall

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            国产婷婷色一区二区三区在线| 久久久久久久一区二区三区| 欧美裸体一区二区三区| 欧美一区激情| 欧美一区二区三区的| 亚洲欧美一区二区三区在线| 在线亚洲免费| 亚洲午夜精品久久| 中日韩男男gay无套| 亚洲欧美日韩在线综合| 欧美综合国产| 免费一级欧美片在线观看| 欧美福利一区二区| 欧美无乱码久久久免费午夜一区| 国产精品视频免费| 黄网动漫久久久| 91久久久亚洲精品| 亚洲一区二区伦理| 久久九九电影| 91久久精品一区| 亚洲人体1000| 欧美一区二区在线免费播放| 六月婷婷久久| 国产精品日韩一区二区| 亚洲夫妻自拍| 午夜精品久久久久久99热软件| 久久久免费av| 中文有码久久| 麻豆国产精品一区二区三区 | 夜夜狂射影院欧美极品| 亚洲性人人天天夜夜摸| 久热精品在线视频| 正在播放亚洲一区| 欧美不卡高清| 1024亚洲| 久久久精品tv| 亚洲免费影视| 欧美日韩成人在线观看| 国产综合av| 欧美一区2区三区4区公司二百| 欧美精品在线免费播放| 欧美一区二区三区在线看| 女主播福利一区| 国内精品99| 欧美在线黄色| 一本色道久久综合狠狠躁篇怎么玩| 久久午夜av| 狠狠久久五月精品中文字幕| 亚洲一区二区影院| 亚洲精品影视| 欧美激情久久久| 亚洲人成网站精品片在线观看| 久热精品视频在线| 午夜日韩电影| 国产精品夜夜夜| 亚洲影院色无极综合| 日韩午夜精品视频| 欧美全黄视频| 亚洲精品一区久久久久久| 久久久另类综合| 久久国产精品99精品国产| 国语自产精品视频在线看抢先版结局 | 久久九九久精品国产免费直播| 一片黄亚洲嫩模| 欧美精品综合| 夜夜夜久久久| 亚洲精品欧美激情| 欧美精品www在线观看| 亚洲精品国产精品国自产在线| 欧美成人免费在线视频| 久热精品视频在线| 91久久久在线| 99精品免费视频| 国产精品久久久久久久久果冻传媒| 亚洲视频在线看| 亚洲一区二区三区四区在线观看| 欧美亚洲第一区| 欧美一区二区视频97| 午夜亚洲激情| 亚洲国产成人高清精品| 最新国产の精品合集bt伙计| 欧美国产欧美综合| 亚洲私人影吧| 亚洲免费一级电影| 在线观看91精品国产麻豆| 久久综合中文色婷婷| 欧美激情一区二区| 亚洲在线视频| 久久综合久久久久88| 日韩亚洲国产精品| 中文亚洲欧美| 在线精品高清中文字幕| 亚洲免费成人av| 国产一区二区三区四区hd| 激情小说亚洲一区| 99这里只有精品| 亚洲影视综合| 亚洲国产精品成人综合色在线婷婷| 狂野欧美性猛交xxxx巴西| 欧美成人精品在线观看| 欧美一区二区视频在线| 蜜臀99久久精品久久久久久软件| 一本色道久久精品| 欧美一区二区精品在线| 99国产精品视频免费观看一公开 | 久久九九热re6这里有精品 | 亚洲国产高清在线| 99视频精品在线| 亚洲春色另类小说| 亚洲一区二区视频| 亚洲国产一区二区a毛片| 夜夜精品视频| 激情自拍一区| 午夜一区二区三区在线观看| 亚洲精品免费在线播放| 久久激情婷婷| 一区二区三区精品视频| 久久精品国产精品亚洲综合| 亚洲午夜av电影| 免费毛片一区二区三区久久久| 欧美一区1区三区3区公司| 欧美日韩精品一区二区三区| 狂野欧美激情性xxxx欧美| 国产日韩精品在线| 99精品久久| 亚洲无线视频| 欧美日韩美女一区二区| 亚洲高清久久网| 一区二区在线免费观看| 欧美一区二区国产| 欧美一级黄色网| 国产精品区一区| 一区二区三区久久网| 日韩亚洲精品视频| 欧美极品影院| 亚洲作爱视频| 亚洲视频一区| 欧美日韩系列| 亚洲一卡久久| 欧美影院午夜播放| 国产精品夜夜夜| 亚洲欧美在线看| 久久精品卡一| 狠狠久久亚洲欧美| 久久成人精品无人区| 久久久久久久综合色一本| 国产欧美一区二区三区视频| 亚洲欧美日韩精品久久久久| 亚洲女女做受ⅹxx高潮| 国产精品美女主播| 先锋影音国产精品| 久久久欧美一区二区| 国模精品一区二区三区| 久久午夜电影网| 亚洲欧洲精品一区二区三区波多野1战4| 在线看视频不卡| 欧美成人精品不卡视频在线观看| 亚洲国产99| 亚洲综合欧美日韩| 欧美激情第8页| 国产精品第十页| 亚洲在线观看免费| 欧美在线综合| 国产精品亚洲综合久久| 亚洲欧美影音先锋| 免费不卡在线观看av| 亚洲国产成人不卡| 欧美激情第9页| 亚洲一区二区少妇| 久久天天躁夜夜躁狠狠躁2022 | 国产精品美女久久久免费| 性做久久久久久久免费看| 久久一区免费| 亚洲日韩第九十九页| 国产精品萝li| 久久久精品动漫| 亚洲精品一区二区三区99| 久久se精品一区精品二区| 亚洲第一级黄色片| 国产精品国产亚洲精品看不卡15| 欧美一区二区三区的| 亚洲人成人99网站| 久久视频精品在线| 99国产精品99久久久久久粉嫩| 国产日产欧美一区| 欧美激情视频一区二区三区在线播放 | 欧美成人免费在线| 99精品99| 国产日韩精品在线| 欧美日韩激情网| 久久国产精品第一页| 一本一本大道香蕉久在线精品| 欧美一区二区在线看| 亚洲免费av网站| 国产欧美综合一区二区三区| 欧美激情综合网| 另类人畜视频在线| 欧美在线不卡| 亚洲一区二区三区四区中文| 亚洲美女精品一区|