网络编程中用到的socket属性设置

    int optlen;
    int optval = 1;

    optlen = sizeof(optlen);

    if(setsockopt(socket, IPPROTO_TCP, TCP_NODELAY, (char *)&optval, optlen) < 0)
    {
        printf("%s", strerror(errno));
        return -1;
    }

    ----------------这个选项的作用就是禁用 Nagle’s Algorithm,Nagel算法是为了减少广域网的小分组数目,从而减小网络拥塞的出现,nagle算法会延迟数据包的发送,仅仅对发送队列中最后一个数据包(未完成的数据包)起作用。其目的是解决大量的小包造成网络负担上升的问题,方法是囤积数据到满足条件为止,然后发送大数据包。

    if(setsockopt(socket, SOL_SOCKET, SO_REUSEADDR, (char *)&optval, optlen) < 0)
    {
        printf("%s", strerror(errno));
        return -1;
    }

--------------------一般来说,一个端口释放后会等待两分钟之后才能再被使用,SO_REUSEADDR是让端口释放后立即就可以被再次使用。

    linger s_linger;
    s_linger.l_onoff = 0;
    s_linger.l_linger = 0;

    if(setsockopt(socket, SOL_SOCKET, SO_LINGER, (char *)&s_linger, sizeof(linger)) < 0)
    {
        printf("%s", strerror(errno));
        return -1;
    }
-----------------------linger是继续存留,缓慢消失,逗留的意思;

指定函数close对面向连接的协议如何操作(如TCP)。以下摘自https://blog.csdn.net/factor2000/article/details/3929816

内核缺省close操作是立即返回,如果有数据残留在套接口缓冲区中则系统将试着将这些数据发送给对方。分为三种情况:

1、设置 l_onoff为0,则该选项关闭,l_linger的值被忽略,等于内核缺省情况,close调用会立即返回给调用者,如果可能将会传输任何未发送的数据;

2、设置 l_onoff为非0,l_linger为0,则套接口关闭时TCP夭折连接,TCP将丢弃保留在套接口发送缓冲区中的任何数据并发送一个RST给对方,而不是通常的四分组终止序列,这避免了TIME_WAIT状态;

3、设置 l_onoff 为非0,l_linger为非0,当套接口关闭时内核将拖延一段时间(由l_linger决定)。如果套接口缓冲区中仍残留数据,进程将处于睡眠状态,直 到(a)所有数据发送完且被对方确认,之后进行正常的终止序列(描述字访问计数为0)或(b)延迟时间到。此种情况下,应用程序检查close的返回值是非常重要的,如果在数据发送完并被确认前时间到,close将返回EWOULDBLOCK错误且套接口发送缓冲区中的任何数据都丢失。close的成功返回仅告诉我们发送的数据(和FIN)已由对方TCP确认,它并不能告诉我们对方应用进程是否已读了数据。如果套接口设为非阻塞的,它将不等待close完成。
 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章