1、Socket Options
(1)可以设置和获取的选项
.对应于所有的socket类型的generic options
.靠底层协议支持,在socket层管理的选项
.与协议对应的选项
(2)setsockopt()
int setsockopt(int sockfd, int level, int option, const void *val,socklen_t len); Returns: 0 if OK, -1 on error |
level: generic socket-level options为SOL_SOCKET
协议专属的时候填写: TCP为IPPROTO_TCP, IP为IPPROTO_IP
option:(P580)
val:根据option,指向一个数据结构体或者整数
len:val指向的数据长度大小
(2)getsockopt()
#include <sys/socket.h> int getsockopt(int sockfd, int level, int option, void *restrict val, socklen_t *restrict lenp); Returns: 0 if OK, -1 on error
|
lenp:指向整数的指针,调用getsockopt之前,设置成拷贝options到buffer的大小
如果option>lenp,option将被安静的truncated;
如果option<=lenp,lenp==option大小
2、Out-of-Band Data
(1)在传送队列中,Out-of-Band Data比任何其他的数据都先发送
这是某些协议的选项特性,比如TCP支持,UDP就不支持
(2)TCP只支持1个byte的 "urgent"数据
可以在send() sendto() sendmsg()三个函数中设置MSG_OOB标志
但是如果设置超过1byte,只有最后1byte当着"urgent"数据
(3)当"urgent"数据接收到时,一般发送SIGURG信号
可以安排规定的进程去接收信号
fcntl(sockfd, F_SETOWN, pid); owner = fcntl(sockfd, F_GETOWN, 0)
|
pid>0,sockfd归属于哪个pid
pid<-1,代表sockfd归属于哪个group ID==pid的进程
(4)TCP还支持urgent mark
urgent数据将出现在普通数据流的哪一点
可以用SO_OOBINLINE选项让urgent数据跟普通数据一块接收,为了确认到达urgent mark可以使用sockatmark()函数
#include <sys/socket.h> int sockatmark(int sockfd); Returns: 1 if at mark. 0 if not at mark, -1 on error
|
也可以设置MSG_OOB标志,使用recv(), recvfrom(), recvmsg()函数中的1个提前接收urgent数据
3、Nonblocking and Asynchronous I/O
当可以读取socket数据时,或者写队列的时候有空间了,可以发送SIGIO信号
允许异步I/O需要2步:
.建立socket拥有关系,以便signal可以投递
.使用fcntl的F_SETOWN命令
.使用ioctl的FIOSETOWN命令
.使用ioctl的SIOCSPGRP命令
注:LINUX不支持后2个命令
.当I/O操作不会被block时,告诉socket我们要它singal us
.使用fcntl的F_SETFL命令并使用O_ASYNC标志
.使用ioctl的FIOASYNC命令
阅读(536) | 评论(0) | 转发(0) |