Linux 網路程式設計 高階套接字

2022-07-26 18:30:21 字數 2092 閱讀 6121

一、套接字選項:

有以下3中方式可以對套接字選項進行設定:

getsockopt和setsockopt函式用於獲得和設定套接字的選項值,fcntl用來操作檔案描述符的有關屬性,比如設定套接字檔案描述符工作於非阻塞模式等,而ioctl用於控制i/o裝置。

套接字選項和協議層

協議層(level)

選項(optname)

含義

sol_socket

(套接字通用選項)

so_keepalive

o_resuseaddr

so_linger

so_sndbuf

so_rcvbuf

so_type

so_error

……允許tcp鏈結保活檢測

允許本地位址被重用

允許tcp連線保持一段時間知道資料傳送完畢

套接字傳送緩衝大小

套接字接收緩衝大小

獲得套接字型別

獲得套接字易發生的錯誤並清除

….sol_tcp

(tcp協議層選項)

so_nodelay

tcp_maxseg

禁止tcp  nagle演算法

tcp最大分段值

二、套接字通用選項示例

協議無關是指這些選項是由核心中與協議無關的**來處理的,而不是依賴於

諸如ipv4等和具體ip協議相關的模組

1、so_keepalive 

當對tcp套接字設定了保活選項後,若在兩小時內tcp連線雙方沒有傳送過任何資料,則設定了該選項方tcp將自動向對方傳送保活探測分段,並且接收方tcp必須應答此分段。

雖然客戶端也可以使用該選項,但是該選項通常是由伺服器使用,因為伺服器往往總是處於阻塞狀態,並等待客戶端發來的請求,所以如

果乙個客戶端由於關機或者待機等原因而斷開和伺服器建立的鏈結後,伺服器程序就無法及時知道此情況,這將導致伺服器一直為這些已經斷開的連線繼續分配寶貴的資源,保活選項可以檢測出此情況。

下面是使用so_keepalive 選項檢測丟失連線的**段:

#define true     1

#define false 0

intret;

intsockfd;

intso_keepalive;

so_keepalive =true;

ret = setsockopt(sockfd,sol_socket,so_keepalive,&so_keepalive,sizeof(so_keepalive));

2、so_reuseaddr

當結束乙個已經成功建立了tcp連線的伺服器的執行後,若立刻重新啟動該伺服器,則伺服器不能再次繫結到完全相同的位址埠,根據tcp協議的規定,當伺服器斷開連線後,作為tcp連線的乙個組成部分,該眾所周知的埠將處於2msl狀態,需要經過1~4分鐘後才能重新使用,為了盡快啟動伺服器重新監聽,通過設定so_reuseaddr選項,可以讓伺服器立刻再次繫結到同乙個埠…..

另外,使用so_reuseaddr 選項還需要注意下面兩點:

下面是設定套接字so_reuseaddr 選項的**片段:

#define true 1

#define false 0

intret;

intsockfd;

intso_useaddr;

so_useaddr =true;

ret = setsockopt(sockfd,sol_socket,so_reuseaddr,&so_useaddr,sizeof(so_useaddr));

Linux網路程式設計 套接字結構

1,結構體 struct sockaddr,struct sockaddr in,struct in addr 通用套接字資料結構 struct sockaddr實際使用的套接字資料結構,二者可以進行型別轉換 struct sockaddr in struct in addr 2,主機位元組序和網路...

LINUX網路程式設計之套接字

套接字可以讓linux在網路上通訊,用起來就像管道一樣,當然管道都是單向的,套接字既能寫也能收!以下是多客戶伺服器 include include include include include include include include define port 6000 define size...

Linux網路程式設計 原始套接字

原始套接字 sock raw 應用原始套接字,我們可以編寫出由tcp和udp套接字不能夠實現的功能.注意原始套接字只能夠由有 root許可權的人建立.dos.c include include include include include include include include inclu...