ioctl() fcntl() setsockopt() ioctlsocket() 用法

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  版權聲明:本文爲博主原創文章,轉載請附上博文連接!

相關文章
相關標籤/搜索