UNIX網路程式設計 TCP套接字選項

2021-07-25 22:24:54 字數 3234 閱讀 9864

一直想寫一下tcp通訊的事,

套接字選項:

so_debug:當給乙個tcp套接字開啟本選項時, 核心將為tcp在該套接字傳送和接收的所有分組保留詳細跟蹤資訊。

so_dontroute:本選項規定外出的分組將繞過底層協議的正常路由機制。

so_keepalive:本選項的功用是檢測對端主機是否崩潰或變得不可達。

這個選項非常有用。什麼是心跳機制

so_linger:顧名思義是延遲延緩的意思,這裡是延緩面向連線的socket的close操作。

close函式預設操作是立即返回.但是如果有資料殘留在套接字傳送緩衝區中,系統將試著把這些資料傳送給對端。

控制so_linger通過下面乙個結構:

struct linger

; 通過結構體中成員的不同賦值,可以表現為下面幾種情況:

1. l_onoff設定為0,選項被關閉。l_linger值被忽略,就是上面的預設情形,close立即返回。

2. l_onoff設定為非0,l_linger被設定為0,則close()不被阻塞立即執行,丟棄socket傳送緩衝區中的資料,並向對端傳送乙個rst報文。

這種關閉方式稱為「強制」或「失效」關閉。

3. l_onoff設定為非0,l_linger被設定為非0,則close()呼叫阻塞程序,直到所剩資料傳送完畢或超時。

//setting for keepalive

int keepalive = 1;

setsockopt(incomingsock,sol_socket,so_keepalive,(void*)(&keepalive),(socklen_t)sizeof(keepalive));

int keepalive_time = 30;

setsockopt(incomingsock, ipproto_tcp, tcp_keepidle,(void*)(&keepalive_time),(socklen_t)sizeof(keepalive_time));

int keepalive_intvl = 3;

setsockopt(incomingsock, ipproto_tcp, tcp_keepintvl,(void*)(&keepalive_intvl),(socklen_t)sizeof(keepalive_intvl));

int keepalive_probes= 3;

setsockopt(incomingsock, ipproto_tcp, tcp_keepcnt,(void*)(&keepalive_probes),(socklen_t)sizeof(keepalive_probes));

so_oobinline:

so_rcvbuf:設定接收緩衝區的預設大小。tcp的視窗規模選項是在建立連線時用syn分節與對端互換得到的。對於客戶,必須在呼叫connect之前設定,對於伺服器 ,必須在呼叫listen之前給監聽套接字設定。

so_rcvlowat: 接收緩衝區低水位標記, 是讓select返回「可讀」時套接字接收緩衝區中所需的資料量, 預設值為1。

so_sndbuf:設定傳送緩衝區的預設大小。

so_sndlowat:傳送緩衝區低水位標記, 是讓select返回「可寫」時套接字接收緩衝區中所需的資料量, 預設值為2048。

tcp_maxseg:本選項允許我們獲取或設定tcp連線的最大分節大小(mss);

so_resueaddr: 一般來說,乙個埠釋放後會等待兩分鐘之後才能再被使用,so_reuseaddr是讓埠釋放後立即就可以被再次使主要有四個方面的作用:

1. 允許乙個監聽伺服器到,bind到現在使用的埠上,即使之前存服務埠的連線存在

例如: (1)啟動服務埠:45001,該埠處於listen狀態

(2)有乙個客戶端連線到該埠上,可以派生子程序 來處理該鏈 路

(3)關閉監聽埠,但是步驟2中的鏈路存在

(4)重新啟動監聽埠45001

步驟(4)在socket後執行bind的時候會報錯「address already in use」,如果該程序在socket之後和bind之前設定了so_reuseaddr,bind將會成功。

允許不同的程序bind到同乙個機器上相同埠不同ip位址上

例如:主機上有兩個ip位址,172.17.252.81 172.17.252.82 172.17.252.83

程序a可以bind ip:172.17.252.81 埠:45001 (用netstat看時,172.17.252.81.45001)

程序b可以bind ip:172.17.252.82 埠:45001 (用netstat看時,172.17.252.82.45001)

程序c可以bind ip:統配位址 埠:45001 (用netstat看時,*.45001)

當有客戶端請求時,按照最適合的原則,比如客戶端connect時指定的ip:172.17.252.81則有程序a處理該服務

如果沒有啟動程序a和b,客戶端connect時指定的ip:172.17.252.81則有程序c處理該服務

該情況可能存在風險,對於特權埠,我們都不能bind成功

對於非特權埠,比如45001,主機上有多個ip位址,採用了統配ip來處理客戶的請求,我們可以啟動bind具體ip的服務埠,來

處理客戶端的請求,對於應用來說是比較危險的。

3.允許同乙個程序bind到同乙個機器相同埠不同ip的位址上,與情況2類似

4.允許完全重複的bind,埠和ip相同,此時需要傳輸協議的支援,一般只支援udp

so_reuseport:

1.該選項允許完全的繫結,ip和埠可以完全一樣,每個socket都必須制定該選項

2.如果多播位址,與so_resueaddr含義相同

tcp_nodelay: 當有乙個tcp資料段不足mss,比如要傳送700byte資料,mss為1460byte的情況。nagle演算法會延遲這個資料段的傳送,等待,直到有足夠的資料填充成乙個完整資料段

參考:

linux socket程式設計的心跳機制總結 - 部落格頻道 - csdn.net

UNIX網路程式設計 基本TCP套接字程式設計

一 基於tcp協議的網路程式 下圖是基於tcp協議的客戶端 伺服器程式的一般流程 伺服器呼叫socket bind listen 完成初始化後,呼叫accept 阻塞等待,處於監聽埠的狀態,客戶端呼叫socket 初始化後,呼叫connect 發出syn段並阻塞等待伺服器應答,伺服器應答乙個syn ...

UNIX網路程式設計3 基本TCP套接字程式設計

include int socket int family,int type,int protocal 若成功則返回非負描述符,若失敗則返回 1socket函式成功時返回的為套接字描述符 socket descriptor,簡稱sockfd socket函式的family常值 socket函式的ty...

UNIX網路程式設計 基礎套接字程式設計

就像 unix網路程式設計 裡面說的,我們可以將tcp的連線看成乙個 系統,那麼我們的套接字位址結構,就是我們的 裡面號碼,和其他能確定我們身份資訊的集合。其中ipv4的,我們已經很熟悉,還有另外的,在ipv6如果系統支援長度字段,那麼sin6 len常值必須定義,在使用這一結構時我們必須分清到底,...