linux socket程式設計細節zz

2021-06-19 13:18:09 字數 4115 閱讀 8130

q: 編寫 tcp/sock_stream 服務程式時,

so_reuseaddr到底什麼意思?

a: 這個套接字選項通知核心,如果埠忙,但tcp狀態位於 time_wait ,可以重用埠。如果埠忙,而tcp狀態位於其他狀態,重用埠時依舊得到乙個錯誤資訊,指明"位址已經使用中"。如果你的服務程式停止後想立即重啟,而新套接字依舊使用同一埠,此時 so_reuseaddr 選項非常有用。必須意識到,此時任何非期望資料到達,都可能導致服務程式反應混亂,不過這只是一種可能,事實上很不可能。

乙個套接字由相關五元組構成,協議、本地位址、本地埠、遠端位址、遠端埠。so_reuseaddr 僅僅表示可以重用本地本地位址、本地埠,整個相關五元組還是唯一確定的。所以,重啟後的服務程式有可能收到非期望資料。必須慎重使用 so_reuseaddr 選項。

q:  o_nonblock 與 o_ndelay 有何不同?

a: o_nonblock和o_ndelay所產生的結果都是使i/o變成非擱置模式(non-blocking),在讀取不到資料或是寫入緩衝區已滿會馬上return,而不會擱置程式動作,直到有資料或寫入完成。

它們的差別在於設立o_ndelay會使i/o函式馬上回傳0,但是又衍生出乙個問題,因為讀取到檔案結尾時所回傳的也是0,這樣無法得知是哪中情況;因此,o_nonblock就產生出來,它在讀取不到資料時會回傳-1,並且設定errno為eagain。

不過需要注意的是,在gnu c中o_ndelay只是為了與bsd的程式相容,實際上是使用o_nonblock作為巨集定義,而且o_nonblock除了在ioctl中使用,還可以在open時設定。

socket描述符選項[sol_socket]

socket描述符選項[sol_socket]

#include

int setsockopt( int socket, int level, int option_name,

const void *option_value, size_t option_len);

第乙個引數socket是套接字描述符。第二個引數level是被設定的選項的級別,如果想要在套接字級別上設定選項,就必須把level設定為sol_socket。 option_name指定準備設定的選項,option_name可以有哪些取值,這取決於level,以linux 2.6核心為例(在不同的平台上,這種關係可能會有不同),在套接字級別上(sol_socket),option_name可以有以下取 值:

so_debug,開啟或關閉除錯資訊。

當option_value不等於0時,開啟除錯資訊,否則,關閉除錯資訊。它實際所做的工作是在sock->sk->sk_flag中置 sock_dbg(第10)位,

或清sock_dbg位。

so_reuseaddr,開啟或關閉位址復用功能。

當option_value不等於0時,開啟,否則,關閉。它實際所做的工作是置sock->sk->sk_reuse為1或0。

so_dontroute,開啟或關閉路由查詢功能。

當option_value不等於0時,開啟,否則,關閉。它實際所做的工作是在sock->sk->sk_flag中置或清 sock_localroute位。

so_broadcast,允許或禁止傳送廣播資料。

當option_value不等於0時,允許,否則,禁止。它實際所做的工作是在sock->sk->sk_flag中置或清 sock_broadcast位。

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

傳送緩衝區的大小是有上下限的,其上限為256 * (sizeof(struct sk_buff) + 256),下限為2048位元組。該操作將sock->sk->sk_sndbuf設

置為val * 2,之所以要乘以2,是防

大資料量的傳送,突然導致緩衝區溢位。最後,該操作完成後,因為對傳送緩衝的大小 作了改變,要

檢查sleep佇列,如果有程序正在等待寫,將它們喚醒。

so_rcvbuf,設定接收緩衝區的大小。

接收緩衝區大小的上下限分別是:256 * (sizeof(struct sk_buff) + 256)和256位元組。該操作將sock->sk->sk_rcvbuf設定為val * 2。

so_keepalive,套接字保活。

如果協議是tcp,並且當前的套接字狀態不是偵聽(listen)或關閉(close),那麼,當option_value不是零時,啟用tcp保活定時 器,否

則關閉保活定時器。對於所有協議,該操

作都會根據option_value置或清 sock->sk->sk_flag中的 sock_keepopen位。

so_oobinline,緊急資料放入普通資料流。

該操作根據option_value的值置或清sock->sk->sk_flag中的sock_urginline位。

so_no_check,開啟或關閉校驗和。

該操作根據option_value的值,設定sock->sk->sk_no_check。

so_priority,設定在套接字傳送的所有包的協議定義優先權。linux通過這一值來排列網路佇列。

這個值在0到6之間(包括0和6),由option_value指定。賦給sock->sk->sk_priority。

so_linger,如果選擇此選項, close或 shutdown將等到所有套接字裡排隊的訊息成功傳送或到達延遲時間後》才會返回. 否則, 呼叫將立即返回。

該選項的引數(option_value)是乙個linger結構:

struct linger ;

如果linger.l_onoff值為0(關閉),則清 sock->sk->sk_flag中的sock_linger位;否則,置該位,並賦sk->sk_lingertime值為 linger.l_linger。

so_passcred,允許或禁止scm_credentials 控制訊息的接收。

該選項根據option_value的值,清或置sock->sk->sk_flag中的sock_passcred位。

so_timestamp,開啟或關閉資料報中的時間戳接收。

該選項根據option_value的值,清或置sock->sk->sk_flag中的sock_rcvtstamp位,如果開啟,則還需 設sock->sk->sk_flag中

的sock_timestamp位,同時,將全域性變數

netstamp_needed加1。

so_rcvlowat,設定接收資料前的緩衝區內的最小位元組數。

在linux中,緩衝區內的最小位元組數是固定的,為1。即將sock->sk->sk_rcvlowat固定賦值為1。

so_rcvtimeo,設定接收超時時間。

該選項最終將接收超時時間賦給sock->sk->sk_rcvtimeo。

so_sndtimeo,設定傳送超時時間。

該選項最終將傳送超時時間賦給sock->sk->sk_sndtimeo。

so_bindtodevice,將套接字繫結到乙個特定的裝置上。

該選項最終將裝置賦給sock->sk->sk_bound_dev_if。

so_attach_filter和so_detach_filter。

關於資料報過濾,它們最終會影響sk->sk_filter。

以上所介紹的都是在sol_socket層的一些套接字選項,如果超出這個範圍, 給出一些不在這一level的選項作為引數,最終會得

到- enoprotoopt的返回值。但以上的分析僅限

於這些選項對sock-sk的值的影響,這些選項真正如何發揮作用,我們的探索道路 將漫漫其修遠。

linux socket 程式設計

兩段程式 可用於開發板和主機之間的資料傳輸,很管用!file client.c檔案傳輸客戶端程式示例 本檔案是客戶機的 include for sockaddr in include for socket include for socket include for printf include f...

linux socket程式設計

雙休日無聊透頂,看了四五集 反恐24小時 實在不想看了,於是就想搞linux的socket programming來玩玩,前期資料都準備好 早就想寫個看看了。首先,寫個簡單的client端的程式 呵,其實是copy!server端用的是網上當的乙個除錯工具 一開始用的是以前用過的乙個多執行緒執行的介...

Linux Socket程式設計 執行緒

本章主要列舉伺服器程式的各種網路模型,示例程式以及效能對比後面再寫。一 分類依據。伺服器的網路模型分類主要依據以下幾點 1 是否阻塞方式處理請求,是否多路復用,使用哪種多路復用函式 2 是否多執行緒,多執行緒間如何組織 3 是否多程序,多程序的切入點一般都是accept函式前 二 分類。首先根據是否...