目录
1、setsockopt()函数
头文件:
#include <sys/types.h>
#include <sys/socket.h>
函数声明:
int setsockopt(int s,int level,int optname,const void* optval,socklen_t optlen);
setsockopt()用来设置参数s 所指定的socket 状态。
s:待设置的socket。
level:代表欲设置的网络层,一般设为SOL_SOCKET以存取SOCKET层。
optname:一般有下列几种数值
- SO_DEBUG 打开或关闭排错模式
- SO_REUSEADDR 允许在bind()过程中本地地址可重复使用
- SO_TYPE 返回socket形态
- SO_ERROR 返回socket已发生的错误原因
- SO_DONTROUTE 送出的数据包不要利用路由设备来传输
- SO_BROADCAST 使用广播方式传送
- SO_SNDBUF 设置送出的暂存区大小
- SO_RCVBUF 设置接收的暂存区大小
- SO_KEEPALIVE 定期确定连线是否已终止
- SO_OOBINLINE 当接收到OOB数据时会马上送至标准输入设备
- SO_LINGER 去报数据安全且可靠的传送出去
optval:欲设置的值
opelen:optval的长度
返回值:成功返回0,,若有错误则返回-1,错误原因存于error,错误原因有以下情况:
- EBADF 参数s 并非合法的socket 处理代码
- ENOTSOCK 参数s 为一文件描述词, 非socket
- ENOPROTOOPT 参数optname 指定的选项不正确.
- EFAULT 参数optval 指针指向无法存取的内存空间.
2、getsockopt()函数
头文件:
#include <sys/types.h>
#include <sys/socket.h>
函数声明:
int getsockopt(int s,int level,int optname,void* optval,socklen_t optlen);
getsockopt()会将参数s所指定的socket状态返回。
s:待读取的socket。
level:代表欲读取的网络层,一般设为SOL_SOCKET以存取SOCKET层。
optname:一般有下列几种数值
- SO_DEBUG 打开或关闭排错模式
- SO_REUSEADDR 允许在bind()过程中本地地址可重复使用
- SO_TYPE 返回socket形态
- SO_ERROR 返回socket已发生的错误原因
- SO_DONTROUTE 送出的数据包不要利用路由设备来传输
- SO_BROADCAST 使用广播方式传送
- SO_SNDBUF 读取送出的暂存区大小
- SO_RCVBUF 读取接收的暂存区大小
- SO_KEEPALIVE 定期确定连线是否已终止
- SO_OOBINLINE 当接收到OOB数据时会马上送至标准输入设备
- SO_LINGER 去报数据安全且可靠的传送出去
optval:值地址
opelen:optval的长度
返回值:成功返回0,,若有错误则返回-1,错误原因存于error,错误原因有以下情况:
- EBADF 参数s 并非合法的socket 处理代码
- ENOTSOCK 参数s 为一文件描述词, 非socket
- ENOPROTOOPT 参数optname 指定的选项不正确.
- EFAULT 参数optval 指针指向无法存取的内存空间.
3、简单实例
/*================================================================
* Copyright (C) 2021 baichao All rights reserved.
*
* 文件名称:setsockopt_getsockopt.cpp
* 创 建 者:baichao
* 创建日期:2021年01月25日
* 描 述:
*
================================================================*/
#include <iostream>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <sys/types.h>
int main()
{
int tcp_socket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
int optval;
socklen_t optvallen;
int sockopt = getsockopt(tcp_socket,SO_SNDBUF,SOL_SOCKET,&optval,&optvallen);
std::cout<<"1 optval:"<<optval<<",optvallen:"<<optvallen<<std::endl;
optval = 24*1024;
optvallen = 4;
sockopt = setsockopt(tcp_socket,SOL_SOCKET,SO_SNDBUF,&optval,optvallen);
sockopt = getsockopt(tcp_socket,SOL_SOCKET,SO_SNDBUF,&optval,&optvallen);
std::cout<<"2 optval:"<<optval<<",optvallen:"<<optvallen<<std::endl;
return 0;
}
运行结果: