UNIX网络编程——套接字选项(SO_RCVBUF和SO_SNDBUF)
? ? ?有時(shí)候我們需要控制套接字的行為(如修改緩沖區(qū)的大小),這個(gè)時(shí)候我們就要學(xué)習(xí)套接字選項(xiàng)。
int getsockopt(int sockfd,int level,int optname,void *optval,socklen_t *optlen) int setsockopt(int sockfd,int level,int optname,const void *optval,socklen_t *optlen)
level指定控制套接字的層次.可以取三種值:
- SOL_SOCKET:通用套接字選項(xiàng).?
- IPPROTO_IP:IP選項(xiàng).?
- IPPROTO_TCP:TCP選項(xiàng).?
? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ?
optname指定控制的方式(選項(xiàng)的名稱)
optval獲得或者是設(shè)置套接字選項(xiàng).根據(jù)選項(xiàng)名稱的數(shù)據(jù)類型進(jìn)行轉(zhuǎn)換??
返回值說(shuō)明:
成功執(zhí)行時(shí),返回0。失敗返回-1,errno被設(shè)為以下的某個(gè)值 ?
EBADF:sock不是有效的文件描述詞
EFAULT:optval指向的內(nèi)存并非有效的進(jìn)程空間
EINVAL:在調(diào)用setsockopt()時(shí),optlen無(wú)效
ENOPROTOOPT:指定的協(xié)議層不能識(shí)別選項(xiàng)
ENOTSOCK:sock描述的不是套接字
數(shù)據(jù)結(jié)構(gòu)說(shuō)明:
1)結(jié)構(gòu):linger,它的聲明如下:
struct linger{int l_onoff; //狀態(tài)int l_linger; //等待時(shí)間 };2)結(jié)構(gòu):timeval,它的聲明如下:
struct timeval{time_t tv_sec; //秒suseconds_t tv_usec; //微秒:百萬(wàn)分之一秒 };
舉例說(shuō)明:
? ? ?SO_RCVBUF和SO_SNDBUF每個(gè)套接口都有一個(gè)發(fā)送緩沖區(qū)和一個(gè)接收緩沖區(qū),使用這兩個(gè)套接口選項(xiàng)可以改變?nèi)笔【彌_區(qū)大小。
// 接收緩沖區(qū) int nRecvBuf=32*1024; //設(shè)置為32K setsockopt(s,SOL_SOCKET,SO_RCVBUF,(const char*)&nRecvBuf,sizeof(int)); //發(fā)送緩沖區(qū) int nSendBuf=32*1024;//設(shè)置為32K setsockopt(s,SOL_SOCKET,SO_SNDBUF,(const char*)&nSendBuf,sizeof(int));
注意:
? ? ?當(dāng)設(shè)置TCP套接口接收緩沖區(qū)的大小時(shí),函數(shù)調(diào)用順序是很重要的,因?yàn)門CP的窗口規(guī)模選項(xiàng)是在建立連接時(shí)用SYN與對(duì)方互換得到的。對(duì)于客戶,SO_RCVBUF選項(xiàng)必須在connect之前設(shè)置;對(duì)于服務(wù)器,SO_RCVBUF選項(xiàng)必須在listen前設(shè)置。
轉(zhuǎn)載于:https://www.cnblogs.com/wangfengju/p/6172581.html
總結(jié)
以上是生活随笔為你收集整理的UNIX网络编程——套接字选项(SO_RCVBUF和SO_SNDBUF)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: C#中打开设计视图时报未将对象引用设置到
- 下一篇: 【Hibernate3.3复习知识点二】