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

我们还可以自己设置套接字的参数,例如缓冲区的大小,是否使用Nagle算法等等

直接上代码跟注释吧,前段时间写好放在电脑上的,直接copy一份,懒得排格式了

#include 

//设置套接字的参数主要通过两个函数。一个是设置,一个是获取设置
//获取参数
//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));`这里写代码片`

你可能感兴趣的:(TCP)