《Unix網路程式設計》中未提及的Socket選項
在setsockopt函式中常用Socket選項對socket進行一些必要的設定,使socket可以按我們預期的特性去工作。
SO_TIMESTAMP,一個Socket選項,在權威著作《Unix網路程式設計》中未提及到,即使在google上也難找到其詳細解釋與用法。然而在開原始碼ptpv2d-rc1中用到了這個socket選項,那麼它到底是用來做什麼的呢。
分析過linux-2.6.32核心原始碼後,發現通過設定此選項,我們可以讓核心協議棧在接受到一個網路幀時為其打上時間戳,並將此時間戳作為一筆附加資料,與網路幀資料一起遞交到上層協議。
netif_receive_skb(),linux核心協議棧中的關鍵函式,通常在網絡卡驅動程式poll函式(RX中斷處理函式會排程poll函式,詳情參考最新核心機制NAPI)的最後一步呼叫,佔們用來處理網路幀,並將網路幀遞交至上層協議,而netif_receive_skb函式第一件要做的事就是呼叫net_timestamp,為當前收到的網路幀打時間戳(net_timestamp函式裡會判斷是否已經使能了網路時間戳功能,即netstamp_need),並將此時間戳作為一筆SCM_TIMESTAMP型別的附加資料插入sk_buff(即cmsg)。
上層程式碼如果要獲取核心協議棧為網路幀打的時間戳,就需要拿到附加資料,很顯然,我們要拿的是SCM_TIMESTAMP型別的附加資料。
我們要在收到的報文中遍歷附加資料(可能有很多筆附加資料),可以使用CMSG_FIRSTHDR()與CMSG_NXTHDR()巨集在附加資料物件中進行遍歷,if(cmsg->cmsg_level == SOL_SOCKET && cmsg->cmsg_type == SCM_TIMESTAMP)條件一旦成立,就表明已經找到了SCM_TIMESTAMP型別的附加資料,那就是之前核心協議棧為這一幀網路報文打上的時間戳,也就是收到此網路報文的時間。
這個特性在PTP協議中非常有用,要做網路時間同步,必須有辦法知道網路報文收到的時間,如果沒有硬體時間戳(精密PHY),上層應用程式就需要使用此特性獲取網路幀收到時的時間戳,或者自己編寫核心模組程式碼接入底層協議棧,加蓋軟體時間戳。
相關推薦
Linux系統網路程式設計中TCP通訊socket--send導致程序被關閉
send(sockfd, buff, sizeof(buff), 0); 在linuxTCP通訊中上述send形式是常用的設定方式,但是如果在TCP連結斷開後呼叫該send函式,多次即會導致程序結束。 解決方法 最簡單的方式就是 send(sockfd, buff, sizeo
linux網路程式設計二十:socket選項:SO_RCVTIMEO和SO_SNDTIMEO
SO_RCVTIMEO和SO_SNDTIMEO ,它們分別用來設定socket接收資料超時時間和傳送資料超時時間。 因此,這兩個
《Unix網路程式設計》中未提及的Socket選項
在setsockopt函式中常用Socket選項對socket進行一些必要的設定,使socket可以按我們預期的特性去工作。 SO_TIMESTAMP,一個Socket選項,在權威著作《Unix網路程式設計》中未提及到,即使在google上也難找到其詳細
socket網路程式設計中常用的SO_KEEPALIVE套接字選項
使用getsocketopt( )可以得到當前套接字的選項內容使用setsocketopt( )函式設定應用程式需要使用的套接字選項SO_KEEPALIVE選項: 設定了這個選項後,如果TCP連
淺談 TCP/IP 網路程式設計中 socket 的行為
來源:PromisE_謝 連結:www.cnblogs.com/promise6522/archive/2012/03/03/2377935.html 我認為,想要熟練掌握 Linux 下的 TCP/IP 網路程式設計,至少有三個層面的知識需要熟悉: TCP/IP
關於網路程式設計中Socket的初步總結
1,要實現通訊必須先建立套接字 2,上一步驟中建立的套接字只用於listen()和accept(),不用於收發資料【以tcp為例來說】 [https://blog.csdn.net/David_xtd/article/details/7087843?utm_source=blogxg
網路程式設計中time_wait的作用和套接字選項SO_REUSEADDR
這兩天看APUE為一個簡單的問題特別惱火,該問題起源於兩個套接字選項就是SO_REUSEADDR和SO_REUSEPORT其實在看的過程中問學長了,學長解釋的也比較清楚,就是自己悟性不好,一時半會沒理解。自己在網上找了幾篇優秀的部落格看了,受益頗多! 先從套接字選項SO_REUSEADD
Unix網路程式設計第三版中程式碼環境搭建
最近在啃《Unix網路程式設計第三版 卷1》,其中出現了很多關於unp.h的地方,應該是書中自帶的檔案,搜尋了一下,下載了原始碼來自己編譯。編譯步驟tar zxvf unpv13e.tar.gz ./configure cd lib make cd ../libfree make cd ../libg
網路程式設計中重要函式總結:如何判斷socket關閉
1、阻塞模式與非阻塞模式下recv的返回值各代表什麼意思?有沒有區別?(就我目前瞭解阻塞與非阻塞recv返回值沒有區分,都是 <0:出錯,=0:連線關閉,>0接收到資料大小,特別:返回值 <0時並且(errno == EINTR || errno == EWOULDBLOCK |
socket網路程式設計中伺服器與客戶端通訊失敗的問題
伺服器程式碼如下 public class server { public static void main(String[] args) throws IOException { ServerSocket server=new S
Windows網路程式設計中Socket與WSASocket區別
這2個函式的主要功能都是建立一個SOCKET,函式定義分別如下: SOCKET WSAAPI socket( _In_ int af, _In_ int type, _In_ int pr
淺談TCP/IP網路程式設計中socket的行為
socket錯誤碼: EINTR: 4 阻塞的操作被取消阻塞的呼叫打斷。如設定了傳送接收超時,就會遇到這種錯誤。 只能針對阻塞模式的socket。讀,寫阻塞的socket時,-1返回,錯誤號為INTR。另外,如果出現EINTR即errno為4,錯誤描述Interrupted system call,操作
java網路程式設計中常用的類
java網路程式設計中常用的類 1、InetAddress 用於封裝計算機的IP地址和DNS(Domain Name System域名系統)(沒有埠資訊) InetAddress沒有構造器,要得到物件只能通過靜態方法實現 /** * 使用getLocalHost的方法建立InetA
Unix網路程式設計關於time_wait狀態的解釋
面試網路程式設計的同學基本上都會被問到對time_wait狀態的理解,今天記錄一下。 TIME_WAIT狀態解釋: 毫無疑問,TCP中有關網路程式設計最不容易理解的是它的TIME_WAIT狀態,我們可以知道 是執行主動關閉的那端經歷了這個狀態。該端點停留在這個狀
網路程式設計<<初識socket>>
楔子 你現在已經學會了寫python程式碼,假如你寫了兩個python檔案a.py和b.py,分別去執行,你就會發現,這兩個python的檔案分別執行的很好。但是如果這兩個程式之間想要傳遞一個數據,你要怎麼做呢?這個問題以你現在的知識就可以解決了,我們可以建立一個檔案,把a.py想要傳遞的內容寫到檔案中,然
Android網路程式設計中的URLConnection的IP設定
虛擬機器測試:10.0.0.2 PC連線乙太網:通過cmd命令,進入命令視窗。輸入ipconfig檢視乙太網介面卡ipv4地址 Android測試機連入本機WiFi網路:如圖 如果Android上提示 java.net.SocketTimeoutEx
【網路程式設計】TCP網路程式設計中connect()、listen()和accept()三者之間的關係
舉個簡單的例子(以下程式碼只是示範性的,用於說明不同套接字的作用,實際的函式會需要更多的引數): /* 建立用於監聽和接受客戶端連線請求的套接字 */ server_sock = socket(); /* 繫結監聽的IP地址和埠 */ bind(server_sock); /* 開始監聽 */ li
UNIX網路程式設計卷1:套接字聯網API 詳解筆記
UNIX網路程式設計卷1:套接字聯網API 詳解筆記 第一部分:簡介和TCP/IP 1.Socket 套接字 sockfd = socket(AF_INET(網際流), SOCK_STREAM, 0); 2.*bind(int fd, const struct sockaddr sa,
UNIX網路程式設計——基本TCP套接字程式設計 【轉貼】
一、基於TCP協議的網路程式 下圖是基於TCP協議的客戶端/伺服器程式的一般流程: &
《Unix網路程式設計第版(1卷)》pdf附網盤下載連結送給還在迷茫的你
技術書閱讀方法論 一.速讀一遍(最好在1~2天內完成) 人的大腦記憶力有限,在一天內快速看完一本書會在大腦裡留下深刻印象,對於之後複習以及總結都會有特別好的作用。 對於每一章的知識,先閱讀標題,弄懂大概講的是什麼主題,再去快速看一遍,不懂也沒有關係,但是一定要在不懂的