1. 程式人生 > >網路程式設計標頭檔案小結

網路程式設計標頭檔案小結

網路程式設計的標頭檔案(這裡所有的標頭檔案都在/usr/include目錄下面)
經常被一些標頭檔案搞大,不知到到哪個標頭檔案去找結構。這裡做個總結。

ip頭部 
有兩個ip頭部結構,分別是 
linux/ip.h 下面結構名字struct iphdr
netinet/ip.h 結構名字,這裡有兩個struct iphdr 和 struct ip 
這三個都是一樣的,看個人喜好,我個人喜換netinet/ip.h下面的struct iphdr;

tcp頭部
兩個
linux/tcp.h  struct tcphdr
netinet/tcp.h struct tcphdr
任選,不過網路程式設計的一般在netinet這個地下選,系統變成的一般去linux目錄。


udp頭部
兩個
linux/udp.h struct udphdr
netinet/udp.h struct udphdr

icmp頭部
linux/icmp.h struct icmphdr
netinet/ip_icmp.h struct icmphdr    

arp頭部
linux/if_arp.h struct arphdr
net/if_arp.h   struct arphdr  // 主要不是netinet目錄了,net。

乙太網頭部
linux/if_ether.h  struct ethhdr
原則上在netinet的if_ether.h 檔案中沒有定義struct ethhdr,但是,在這個檔案中,
它引用了上面的檔案linux/if_ether.h,所以也可也引用這個檔案來定義 struct ethhdr.
這樣就統一了。
值得說明的是,netinet/if_ether.h中定義了struct ether_arp ,它是整個arp包(包括arp首部)的定義。

以上就是各個資料包的頭部格式,這在編寫構造自己的包時候很有用。

另外,還有些標頭檔案。
netinet/in.h  定義了ip地址結構 struct sockaddr_in (struct in_addr作為sockaddr_in 的成員) 還有函式 htons等,以及一些巨集。
在編寫使用者應用程式時,是少不了這個標頭檔案的(因為要構造ip地址呀)

arpa/inet.h  定義了地址轉換函式  inet_ntoa inet_aton inet_pton 等等。(不過實現在別處)。

sys/socket.h 定義了一些列的socket API函式 如 socket,bind listen , send ,sendmsg,setsockopt,等等。所以這個標頭檔案和netinet/in.h標頭檔案是使用者程式不可缺少的。


......................................................................
#include <linux/udp.h>
//udp
struct udphdr
{
    u_int16_t source;
    u_int16_t dest;
    u_int16_t len;
    u_int16_t check;
};

........................................................................
#include <linux/icmp.h>
struct icmphdr
{
    u_int8_t type;//0--reques,8---reply,11----timeout;
    u_int8_t code;
    u_int16_t checksum;
    ........
};
..........................................................................
#include <linux/ip.h>
struct iphdr
{
#if defined(__LITTLE_ENDIAN_BITFIELD)
    __u8    ihl:4,
        version:4;
#elif defined (__BIG_ENDIAN_BITFIELD)
    __u8    version:4,
          ihl:4;
#else
#error    "Please fix <asm/byteorder.h>"
#endif
    __u8    tos;
    __be16    tot_len;
    __be16    id;
    __be16    frag_off;
    __u8    ttl;
    __u8    protocol; // 1--icmp 6---tcp 17---udp
    __sum16    check;
    __be32    saddr;
    __be32    daddr;
    /*The options start here. */
};
.........................................................................
#include <linux/tcp.h>
struct tcphdr {
    __be16    source;
    __be16    dest;
    __be32    seq;
    __be32    ack_seq;
#if defined(__LITTLE_ENDIAN_BITFIELD)
    __u16    res1:4,
        doff:4,
        fin:1,
        syn:1,
        rst:1,
        psh:1,
        ack:1,
        urg:1,
        ece:1,
        cwr:1;
#elif defined(__BIG_ENDIAN_BITFIELD)
    __u16    doff:4,
        res1:4,
        cwr:1,
        ece:1,
        urg:1,
        ack:1,
        psh:1,
        rst:1,
        syn:1,
        fin:1;
#else
#error    "Adjust your <asm/byteorder.h> defines"
#endif    
    __be16    window;
    __sum16    check;
    __be16    urg_ptr;
}

.........................................................................
#include <linux/if_ether.h>
struct ethhdr
{
    unsigned char h_dest[6];
    unsigned char h_source[6];
    __be16       h_proto;//0x0806---arp,0x0800--ip,0x0835---rarp.
}
.........................................................................



#include <linux/...//暫時沒找到位置>
struct arphdr
{
    unsigned short hard_type;//硬體型別,通常0x0001(乙太網)
    unsigned short protocol;//協議型別,通常0x0800(IP)
    unsigned char hard_length;
    .....
    unsigned short operation_type;//操作型別,1,ARP請求,2,ARP應答
    //參考http://baike.baidu.com/view/121586.htm?fr=aladdin
}




相關推薦

網路程式設計檔案小結

網路程式設計的標頭檔案(這裡所有的標頭檔案都在/usr/include目錄下面) 經常被一些標頭檔案搞大,不知到到哪個標頭檔案去找結構。這裡做個總結。 ip頭部 有兩個ip頭部結構,分別是 linux/ip.h 下面結構名字struct iphdr netinet/i

linux網路程式設計常用檔案

sys/types.h:資料型別定義 sys/socket.h:提供socket函式及資料結構 netinet/in.h:定義資料結構sockaddr_in arpa/inet.h:提供IP地址轉換函式 netdb.h:提供設定及獲取域名的函式 sys/ioctl.h:提供

Unix——《Unix網路程式設計》配置unp.h檔案

《Unix網路程式設計 卷1》unp.h 標頭檔案及其編譯問題 本書原始碼下載地址 http://www.unpbook.com 解壓tar -zxvf unpv13e.tar.gz 其實各個編譯過程都在README中,下面給出正確的編譯過程 首

linux 下網路程式設計結構體定義對應的檔案

netinet/if_ether.h   ether_arp的資料結構 netinet/ether.h    以太禎的網路位元組和ascii位元組的轉換,包括ether_ntoa(),ether_aton這樣的函式定義 netinet/ip.h   這個標頭檔案和linux/ip.h似乎很相似,也有iphd

Unix網路程式設計之-------unp.h檔案詳細配置-1

unix網路程式設計unp.h最詳細全面配置說明 今天開始學習Unix網路程式設計這本大神之作了,由於之前在學習另外一本傑作Unix環境高階程式設計,遇到過第一個程式編譯報錯的情況,知道這是大神自己寫

對linux下程式設計中用到的檔案的一些定義及函式進行解譯(本人使用過程中用到過的不明白的定義及函式)

1、typedef unsigned long int pthread_t; 型別定義: typedef unsigned long int pthread_t; //come from /usr/include/bits/pthreadtypes.h 用途:pthread_t用於宣

《OpenCV3程式設計入門》——“opencv.hpp” 檔案認知

# include <opencv2/opencv.hpp>標頭檔案定義類似如下: # include <opencv2/opencv.hpp> # ifndef_OPENCV_ALL_HPP_ #define_OPENCV_ALL_HPP_  

程式設計基礎35 tips stdio.h檔案下的全域性陣列問題

使用<stdio.h>,然後對程式進行c的執行時, 全域性變數中如果使用字串或者是二維字串, 便會出錯。 一, 例如: #include<stdio.h> #include<string.h> const int max_n = 100; ch

Linux CURL安裝及C程式設計中curl.h檔案缺少問題解決

curl安裝 –獲得安裝包,從網上直接下載或者其他途徑,這裡直接wget # wget http://curl.haxx.se/download/curl-7.17.1.tar.gz  此處可以選擇最新版本。官網http://curl.haxx.se/ –解壓到當前目錄

JNi程式設計生成檔案

最近在學習JNI程式設計,但是剛開始就遇到了麻煩,生成不了標頭檔案!!!! 在查找了大量資料之後,終於找到了解決方案: ①先寫一個類,把native方法的呼叫寫在裡面 ②到根目錄下執行javac test.java生成.class檔案 ③回到src目錄,執

C語言程式設計 學習筆記 12.3 多個原始碼檔案檔案、宣告

我們經常在做“分而治之”的事情(多個.c檔案): 1.main()裡的程式碼太長了適合分成幾個函式 2.一個原始碼檔案太長了適合分成幾個檔案 3.兩個獨立的原始碼檔案不能編譯成可執行的程式 對於(1),我們可以舉以下例子: 有個主函式main.c,有另外一個函式

Linux C程式設計——常用檔案

1 資料型別 1.1 stdint.h uint8_t uint16_t uint32_t 1.2 stdbool.h     C語言中是沒有bool型別的(C++中有),若要使用此型別,需要包含標

jni程式設計,使用javah命令生成方法簽名檔案

最近使用javah命令生成方法簽名標頭檔案,百度到的方法多有問題,後來採用如下方法解決: 1、Windows中在開始選單中命令列輸入cmd,進入命令列選單 2、進入eclipse的工作空間,的當前工程的src目錄下輸入如下命令 D:\workspace\NDKHelloWo

Jni程式設計(二)jni.h 檔案定義分析,以及c/c++呼叫java類的屬性和方法

在第一篇部落格中 我們初步瞭解了jni程式設計的步驟,那接下來我認為極其重要的事情是搞清楚jni.h標頭檔案裡面的結構,包括資料型別和方法的定義等,這些是必須的,否則沒有辦法進行學習,就像寫文章一樣,要先學會寫字是一樣的道理。 首先來看一下jni.h標頭檔案的組成:ps下面

徹底搞明白win32程式設計 .h檔案和.cpp原始檔關係

一.想把專案的全域性引數都放在一個檔案裡,好方便對初始值修改。 步驟: 1.新建一個.h標頭檔案,只宣告引數為全域性變數(注意是宣告!!!)。 2.一定要extern,這才是宣告全域性變數 而且 一定不能賦初值 extern int a;

linux下socket程式設計常用檔案

sys/types.h:資料型別定義 sys/socket.h:提供socket函式及資料結構 netinet/in.h:定義資料結構sockaddr_in arpa/inet.h:提供IP地址轉換函式 netdb.h:提供設定及獲取域名的函式 sys/ioct

條件編譯,檔案,靜態庫,共享庫與多檔案程式設計

本文轉自嵌入式Linux中文站 條件編譯 條件編譯即滿足某些條件的時候編譯某部分程式碼,常用於開發多個版本的程式,當滿足條件A時,編譯出免費版本的軟體,當滿足條件B時,編譯除vip版本的軟體,可以提高程式碼的複用率。條件編譯使用"預處理命令+巨集定義"來實現,更多巨集

idea使用javah一鍵編譯JNI的.檔案

.h標頭檔案中方法命名規範需要用到包名,所以,使用javah編譯jni時工作目錄一定要是在包名父目錄中,否則Exception in thread “main” java.lang.IllegalArgumentException: Not a valid class name:

C語言:解決多個C檔案包含同一檔案引起的檔案重複包含問題

解決多個C檔案包含同一標頭檔案引起的檔案重複包含問題,並給出全域性變數如何定義和宣告的方法. 解決方法: 1. 定義公共檔案: global.c 和global.h 其中, global.c檔案中: #include "global.h" //定義全域性變數 int g

iOS 開發: 解決Xcode7.3 不能自動索引檔案,檔名等問題

iOS 開發: 解決Xcode7.3 不能自動索引標頭檔案,檔名,程式碼補全等問題 解決方案: 開啟Xcode –> Target –> BuildSettings –> Apple LLVM 7.1 -Language-Objective C 下面的 Weak