int ioctl(int d, int request, ...); 後續是否有參數根據第二個參數request的須要來決定。服務器
ioctl用於硬件設備I/O通道控制,控制命令與參數都與設備高度相關,一般也與系統高度相關。網絡
int fcntl(int fd, int cmd, ... /* arg */ );後續是否有參數根據第二個參數cmd的須要來決定。這點二者相同。socket
操做控制的對象是: 文件描述符。函數
ioctl()是底層的系統調用(system call),因此跨平臺特性很差。.net
而fcntl則是被封裝的函數,各個OS都是支持的。調試
在網絡socket中,他們做用大概類似。對象
例如均可以設置socket的是否容許非阻塞模式,不過設置方式上略有不一樣:blog
int socketfd = .....;進程
fcntl(sockfd, F_SETFL,fcntl(sockfd, F_GETFL, 0) |O_NONBLOCK);ip
ioctl(sockfd, FIONBIO,1); 1:非阻塞0:阻塞
int setsockopt(int sockfd, int level, int optname, void *optval,socklen_t *optlen);
設置套接字選項.只能操做套接字。
sockfd: 套接字
level: 協議層 SOL_SOCKET/IPPROTO_IP/IPPRO_TCP
optname: 選項名 每個協議層都有其固定的選項名
optval: 緩衝區 set是指向將要存放的地址, get是指向目前存放信息的地址
optlen: 緩衝區大小長度
在socket層經常使用操做有:
SO_BROADCAST 容許發送廣播數據 int
SO_DEBUG 容許調試 int
SO_DONTROUTE 不查找路由 int
SO_ERROR 得到套接字錯誤 int
SO_KEEPALIVE 保持鏈接 int
SO_LINGER 延遲關閉鏈接 structlinger
SO_OOBINLINE 帶外數據放入正常數據流 int
SO_RCVBUF 接收緩衝區大小 int
SO_SNDBUF 發送緩衝區大小 int
SO_RCVLOWAT 接收緩衝區下限 int
SO_SNDLOWAT 發送緩衝區下限 int
SO_RCVTIMEO 接收超時 structtimeval
SO_SNDTIMEO 發送超時 structtimeval
SO_REUSERADDR 容許重用本地地址和端口 int
SO_TYPE 得到套接字類型 int
SO_BSDCOMPAT 與BSD系統兼容 int
使用 SO_RECVBUF 和 SO_SENDBUF能夠改變缺省緩衝區大小
例:
//設置接收緩衝區大小
intn_recvbuf = 32 * 1024;
setsockopt(sockfd, SOL_SOCKET,SO_RECVBUF, (const char*)&n_recvbuf,sizeof(int));
//設置發送緩衝區大小
intn_sendbuf = 32 * 1024;
setsockopt(sockfd, SOL_SOCKDET,SO_SENDBUF, (const char*)&n_sendbuf,sizeof(int));
使用SO_REUSERADDR:
1.當有一個有相同本地地址和端口的socket1處於TIME_WAIT狀態時,而你啓動的程序的socket2要佔用該地址和端口,你的程 序就要用到該選項。
2.SO_RESUERADDR容許同一port上啓動同一服務器的多個實例(多個進程),但每一個實例綁定的IP地址是不能相同的。
3.SO_RESUERADDR容許單個進程綁定相同的端口到多個socket上,但每一個socket綁定的ip地址不一樣。
4.SO_RESUERADDR容許徹底相同的地址和端口的重複綁定,但這隻用於UDP的多播,不用於TCP。 setsockopt()只是針對socket設置參數,是在鏈接中的參數控制,在OS層級的控制則由ioctl和fcntl控制。若是要是獲取socket參數則使用getsockopt. --------------------- 做者:Richard__Lee 來源:CSDN 原文:https://blog.csdn.net/td_sexandzen/article/details/53785835 版權聲明:本文爲博主原創文章,轉載請附上博文連接!