1 getsockopt和setsockopt函数
这两个函数仅用于套接字:
代码语言:javascript复制#include <sys/socket.h>
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);
//均返回:若成功为0,出错为-1
其中sockfd必须指向一个打开套接字描述符 level(级别)指定系统中解释选项的代码或为通用套接字代码,或为某个特定于协议的代码 optval是一个指向某个变量(optval)的指针,setsockopt从*optval中取得选项待设置的新值,getsockopt则把已获取的选项当前值存放到*optval,*optval的大小由最后一个参数optlen指定,它对于setsockopt是一个值参数,对于getsockopt是一个值-结果参数* 调用getsockopt函数时,*optval是一个整数,*optval中返回的值为0,表示相应选项被禁止,不为0表示相应项被启用,类似地,setsockopt函数需要一个不为0的*optval值里启用选项,一个为0的*optval值来禁止选项。
2 fcntl函数(file control函数)
函数fcntl提供了下列关于网络编程特性: (1)非阻塞I/O。通过使用F_SETFL命令设置O_NONBLOCK文件状态标志,我们可以把一个套接字设置为非阻塞型 (2)信号驱动I/O。通过使用F_SETFL命令设置O_ASYNC文件状态标志,我们可以把一个套接字设置成一旦其状态发生变化,内核就产生一个SIGIO信号
代码语言:javascript复制#include <fcntl.h>
int fcntl(int fd, int cmd, ... /* int arg */ );
//返回:若成功取决于cmd,出错-1
每种描述符(包括套接字描述符)都有一组由F_GETFL命令获取或F_SETFL命令设置的文件标志。其中影响套接字描述符的两个标志是:
- O_NONBLOCK——–非阻塞I/O
- O_ASYNC————-信号驱动式I/O
使用fcntl开启(关闭)非阻塞I/O的典型代码
代码语言:javascript复制int flags;
/* Set a socket as nonblocking */
if ( (flags = fcntl (fd, F_GETFL, 0)) < 0)
err_sys("F_GETFL error");
flags |= O_NONBLOCK;//开启
flags |= ~O_NONBLOCK;//关闭
if (fcntl(fd, F_SETFL, flags) < 0)
err_sys("F_SETFL error");