2007年3月15日星期四

vxWorks-套接口选项

获取和设置影响套接口选项的函数:

getsockopt :获取套接口选项 setsockopt: 获取套接口选项 fcntl: 设置套接口为非阻塞I/O型信号驱动I/O型等 oictl 套接口选项 SO-KEEPALIVE SO-LINGER SE-RCVBUF 和 SO-SNDBUF SO-RCVWAT和 SO-SNDLOWAT SO-RCVTIMEO和 SO-SNDTIMEO SO-REUSEADDR和 SO-REUSPORT IP-TTL TCP-KEEPALIVE
getsockopt 和 setsockopt

获得套接口选项: int getsockopt ( int sockfd, int level, int optname, void * optval, socklen_t *opteln ) 设置套接口选项: int setsockopt ( int sockfd, int level, int optname, const void * optval, socklen_t *opteln ) sockfd(套接字): 指向一个打开的套接口描述字 level级别): 指定选项代码的类型。 SOL_SOCKET: 基本套接口 IPPROTO_IP: IPv4套接口 IPPROTO_IPV6: IPv6套接口 IPPROTO_TCP: TCP套接口 optname(选项名): 选项名称 optval(选项值): 是一个指向变量的指针 类型:整形,套接口结构, 其他结构类型:linger{}, timeval{ } optlen(选项长度) :optval 的大小 返回值:标志打开或关闭某个特征的二进制选项
检查套接口选项的程序

输出套接口的选项: 定义感兴趣的套接口选项 调用getsockopt 输出套接口选项 定义联合:不同的套接口选项有不同类型
union val { //套接口选项可能有的5个类型分别作为一个成员: int i_val; long l_val; char c_val[10]; struct linger linger_val; struct timeval timeval_val; //struct {int S; int uS} } val;
//函数原型(prototype),这些函数用于输出套接口选项的值 static char *sock_str_flag(union val *, int); //静态函数,只可在本文件中被调用 static char *sock_str_int(union val *, int); static char *sock_str_linger(union val *, int); static char *sock_str_timeval(union val *, int); //定义结构sock_opts, 其中包含了获得或输出套接口选项的所有信息 struct sock_opts { char *opt_str; //字符名称 int opt_level; //级别 int opt_name; //名称 char *(*opt_val_str)(union val *, int); //函数指针,用于输出, }
//定义结构数组并初始化 struct sock_opts sock_opts[ ] = { //全局变量数组才可以初始化 "SO_BROADCAST", SOL_SOCKET, SO_BROADCAST, sock_str_flag, "SO_DEBUG", SOL_SOCKET, SO_DEBUG, sock_str_flag, #ifdef SO_REUSEPORT //编译时用的宏定义 "SO_REUSEPORT", SOL_SOCKET, SO_REUSEPORT, sock_str_flag, #else //没有这个选项 "SO_REUSEPORT", 0, 0, NULL, //NULL表示没有定义

0 评论: