我们还可以自己设置套接字的参数,例如缓冲区的大小,是否使用Nagle算法等等
直接上代码跟注释吧,前段时间写好放在电脑上的,直接copy一份,懒得排格式了
#include <sys/socket.h>
//设置套接字的参数主要通过两个函数。一个是设置,一个是获取设置
//获取参数
//getsockopt(int sock,int level,int optname,void*optval,socklen_t *optlen)
//sock 套接字文件描述符
//level 要查看的协议层
//optname 要查看的设置项的名称
//optval 保存查看的结果
//socklen_t 返回第四个参数的可选信息向长度
//return 成功返回0 ,失败返回-1
//设置参数
//stesockopt(int sock,int level,int optname,void*optval,socklen_t *optlen)
//sock 套接字文件描述符
//level 要设置的协议层
//optname 要设置项的名称
//optval 要设置的值
//socklen_t 第四个参数的长度
//return 成功返回0 ,失败返回-1
//使用示例
int main(int argc, char const *argv[])
{
int tcp_sock,udp_sock;
int sock_type;
socklen_t optlen;
int state;
optlen=sizeof(sock_type);
tcp_sock=socket(PF_INET,SOCK_STREAM,0);//SOCK_STREAM=1,是一个宏定义 套接字类型
udp_sock=socket(PF_INET,SOCK_DGRAM,0);//SOCK_DGRAM=2 套接字类型
state=getsockopt(tcp_sock,SOL_SOCKET,SO_TYPE,(void*)&sock_type,&optlen);
if(state)
error_handling();
printf("tcp_sock socktype is %d\n",sock_type);//sock_type=1,和SOCK_STREAM是一样的,这个值只能在创建的时候设置,创建了套接字文件描述符之后是不能更改的
state=getsockopt(udp_sock,SOL_SOCKET,SO_TYPE,(void*)&sock_type,&optlen);
if(state)
error_handling();
printf("udp_sock socktype is %d\n",sock_type);//sock_type=2,和SOCK_DGRAM是一样的,这个值只能在创建的时候设置,创建了套接字文件描述符之后是不能更改的
return 0;
}
//选项 :SO_REUSEADDR
//Time-wait状态:
//当服务器和客户端的套接字连接已经建立的时候,如果服务器不正常关闭套接字:连接过程中,服务器使用CTRL+C强制终止程序。此时用同一个端口重新运行程序,会出现bind() error
//原因是当程序已经结束运行,但是套接字有一个Time-wait的过程,在这个事件内,套接字的端口还是在使用状态,当用同一个端口重新重新连接的时候自然会报错
//:SO_REUSEADDR 参数,决定着在time-wait期内的端口是否可以重新分配,默认是0(假)
optlen=sizeof(option);
option=1;
stesockopt(sock,SOL_SOCKET,SO_REUSEADDR,(void *)&option,&optlen);
//选项 TCP_NODELAY 设置Nagle算法的开启或者关闭
//Nagle算法:默认使用,最大限度的进行缓冲,发送一个数据包的时候,会等到收到ACK消息,才会进行下一个数据包的传输
//如果关闭Nagle算法,就不会等待ACK回应,也就是说数据一到达发送缓冲区就会立马被发送,不会等到数据积累到一定程度才会发送,这样会大大增加网络负载
//禁用Nagle算法也是有好处的,禁用之后,不用等待回应数据包,所以能提高数据发送效率,在传输大文件的时候建议关闭Nagel算法
int option=1;
stesockopt(sock,SOL_SOCKET,TCP_NODELAY,(void *)&option,sizeof(option));`这里写代码片`