在之前我们都是直接通过socket()函数创建一个socket文件描述符直接使用,其实这只是系统为我们提供的一个默认的socket描述符,我们可以根据自己的工程的需求来对socket进行相应的配置,以提高程序的效率。
以下就是一些常见的可选项参数:
协议层 | 选项名 | 读取 | 设置 | 作用 |
---|---|---|---|---|
SOL_SOCKET | SO_SENDBUF | O | O | 设置输出缓冲的大小 |
SO_RCVBUF | O | O | 设置输入缓冲去大小 | |
SO_REUSEADDR | O | O | 端口释放后立即重用 | |
SO_KEEPALIVE | O | O | 开启心跳检测 | |
SO_BROADCAST | O | O | 开启广播功能 | |
SO_DONTROURT | O | O | 发送给直连网络,和选用的协议有关 | |
SO_OOBINLINE | O | O | 直接发送单字节数据 | |
SO_ERROR | O | X | 调试和异常信息 | |
SO_TYPR | O | X | 套接字类型 |
协议层 | 选项名 | 读取 | 设置 | 作用 |
---|---|---|---|---|
IPPROTO_IP | IP_TOS | O | O | 修改IP包的TOS字段. |
IP_TTL | O | O | 设置主机发送数据包的生存时间 | |
IP_MULTICAST_TTL | O | O | 设置多播组数据的TTL值 | |
IP_MULTICAST_LOOP | O | O | 设置多播是否回送 | |
IP_MULTICAST_IF | O | O | 设置默认接口 |
协议层 | 选项名 | 读取 | 设置 | 作用 |
---|---|---|---|---|
IPPROTO_TCP | TCP_KEEPALIVE | O | O | 设置主动探测socket是否可用的方式 |
TCP_NODELAY | O | O | 设置Nagle算法 | |
TCP_MAXSEG | O | O | 设置发送给对端的最大数据量 |
设置可选项的方法:
int getsockopt(int sock,int level,int optname,void *optval,socklen_t *optlen):获取socket当前的状态
sock(socket描述符):要查看的socket描述符
level(协议层):要查看的可选项的协议层
optname(可选项名字):要查看的可选项的名字
optval(缓冲地址):可选项值的缓冲地址
optlen(地址长度):保存返回的可选项值的字节数
成功时返回0,失败时返回-1
int setsockopt(int sock,int level,int optname,const void *optval,socklen_t *optlen):设置socket的状态
sock(socket描述符):要设置的socket描述符
level(协议层):要设置的可选项的协议层
optname(可选项名字):要设置的可选项的名字
optval(缓冲地址):要设置的可选项值的缓冲地址
optlen(地址长度):保存要设置的可选项值的字节数
成功时返回0,失败时返回-1