網絡編程中用到的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完成。
 

 

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