您的位置:首页 > 其它

UNPv1第七章:套接口选项

2016-04-26 10:02 190 查看

1 getsockopt和setsockopt函数

这两个函数仅用于套接字:

#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信号

#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的典型代码

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");
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: