精通
英语
和
开源
,
擅长
开发
与
培训
,
胸怀四海
第一信赖
要点:
#include <unistd.h>
#include <fnctl.h>
int fcntl(int sd,int cmd);
int fcntl(int sd,int cmd,long arg);
F_GETFL:读取描述符对应的所有标志,写入到返回值里。
F_SETFL:设置文件描述符的标志,设置值为arg;
F_GETOWN:查找这个socket属于哪个进程,也就是哪个进程接收SIGIO和SIGURG。进程号写入到返回值里。
F_SETOWN:设置隶属的进程。
F_GETSIG:查找出来当能运行I/O操作时发送的信号
F_SETSIG:设置当I/O操作能运行时发送的信号。0值代表SIGIO。返回值是发送的信号,如果是SIGIO,则是0。
flags=fcntl(sd,F_GETFL,0);
fcntl(sd,F_SETFL,flags | O_NONBLOCK);
#include <sys/ioctl.h>
int ioctl(int sd,int command,char*argp);
第三个参数是可选的,依赖于第二个参数。
命令 |
含意 |
SIOCGSTAMP |
从socket里会传递包给用户,传递会发生在具体时刻上,这个命令把最后的时刻返回到第三个参数里,类型为struct timeval |
SIOCSPGRP |
设置接收SIGIO和SIGURG信号的进程(进程组);这种情况下,第三个参数指向一个进程ID。这和fcntl()调用F_SETOWN命令效果一样。 |
FIOASYNC |
重置O_ASYNC标志;第三个参数是标志值。这和fcntl()调用F_SETFL和O_ASYNC效果一样。 |
SIOCGPGRP |
获取接收信号的当前进程(或组)。这和使用fcntl()调用F_GETOWN类似。 |
#include <sys/types.h>
#include <sys/socket.h>
int getsockopt(int sd,int level,int optname,void *optval,socklen_t *optlen);
int setsockopt(int sd,int level,int optname,const void *optval,socklen_t optlen);
int yes=1;
setsockopt(sd,SOL_SOCKET,SO_REUSEADDR,&yes,sizeof(yes));
上面是一个非常好的示例。
值 |
类型 |
含意 |
SO_KEEPALIVE |
int |
定期检查看连接是否有效 |
SO_OOBINLIN |
int |
带外数据会被遗弃 |
SO_RCVLOWAT |
int |
发送和接收缓冲警戒线。在数据发送给协议或用户前,在缓冲里的最小字节个数 |
SO_BSDCOMAT |
|
|
SO_PASSCRED |
int |
|
SO_PEERCRED |
struct |
|
SO_BINDTODEVICE |
char* |
绑定socket到一个指定设备上(比如eth0)。传递空值用来释放。(适用于多个网卡情况) |
SO_DEBUG |
int |
允许调试跟踪。只适用于超级用户 |
SO_REUSEADDR |
int |
允许重用本地地址 |
SO_TYPE |
int |
获取socket类型 |
SO_DONTROUTE |
int |
忽略路由表;适用于直接连接的主机(在一个局域网里) |
SO_BROADCAST |
int |
允许接收或发送组播包。 |
SO_SNDBUF |
int |
获取或设置发送缓冲长度的最大值。参考/proc/sys/net/core/wmem.default和/proc/sys/net/core/wmem.max. |
SO_RCVBUF |
int |
获取或设置接收缓冲长度的最大值。参考/proc/sys/net/core/rmem.default和/proc/sys/net/core/rmem.max. |
SO_LINGER |
struct |
当允许时,延迟关闭socket,直到缓冲队列里的数据处理完了或超时时间到了,才关闭。结构里有超时时间 |
SO_PRIORITY |
int |
设置socket里所有包的级别 |
SO_ERROR |
int |
获取且清除未决socket错误 |