(三)对套接字的设置参数进行设置

我们还可以自己设置套接字的参数,例如缓冲区的大小,是否使用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));`这里写代码片`
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值