Network IPC: Sockets(3)
时间:2010-09-02 来源:blueelfmoon
1、Socket Options
(1)可以设置和获取的选项
.对应于所有的socket类型的generic options
.靠底层协议支持,在socket层管理的选项
.与协议对应的选项
(2)setsockopt()
level: generic socket-level options为SOL_SOCKET
协议专属的时候填写: TCP为IPPROTO_TCP, IP为IPPROTO_IP
option:(P580)
val:根据option,指向一个数据结构体或者整数
len:val指向的数据长度大小
(2)getsockopt()
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信号 可以安排规定的进程去接收信号
pid>0,sockfd归属于哪个pid
pid<-1,代表sockfd归属于哪个group ID==pid的进程
(4)TCP还支持urgent mark urgent数据将出现在普通数据流的哪一点 可以用SO_OOBINLINE选项让urgent数据跟普通数据一块接收,为了确认到达urgent mark可以使用sockatmark()函数
也可以设置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命令
int setsockopt(int sockfd, int level, int option, const void *val,socklen_t len); |
(2)getsockopt()
#include <sys/socket.h> |
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); |
(4)TCP还支持urgent mark urgent数据将出现在普通数据流的哪一点 可以用SO_OOBINLINE选项让urgent数据跟普通数据一块接收,为了确认到达urgent mark可以使用sockatmark()函数
#include <sys/socket.h> |
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命令
相关阅读 更多 +