"+++++++++++++++++++++++++ Linux TCP/UDP通訊中的結構體 +++++++++++++++++++++++++++++++++++++++"node
struct udphdr
{
u_int16_t source;
u_int16_t dest;
u_int16_t len;
u_int16_t check;
};服務器
struct iphdr
{
#if __BYTE_ORDER == __LITTLE_ENDIAN
unsigned int ihl:4;
unsigned int version:4;
#elif __BYTE_ORDER == __BIG_ENDIAN
unsigned int version:4;
unsigned int ihl:4;
#else
# error "Please fix <bits/endian.h>"
#endif
u_int8_t tos;
u_int16_t tot_len;
u_int16_t id;
u_int16_t frag_off;
u_int8_t ttl;
u_int8_t protocol;
u_int16_t check;
u_int32_t saddr;
u_int32_t daddr;
}cookie
/*
* Interface request structure used for socket
* ioctl's. All interface ioctl's must have parameter
* definitions which begin with ifr_name. The
* remainder may be interface specific.
*/網絡
struct ifreq
{
#define IFHWADDRLEN 6
union
{
char ifrn_name[IFNAMSIZ]; /* if name, e.g. "en0" */
} ifr_ifrn;
union {
struct sockaddr ifru_addr;
struct sockaddr ifru_dstaddr;
struct sockaddr ifru_broadaddr;
struct sockaddr ifru_netmask;
struct sockaddr ifru_hwaddr;
short ifru_flags;
int ifru_ivalue;
int ifru_mtu;
struct ifmap ifru_map;
char ifru_slave[IFNAMSIZ]; /* Just fits the size */
char ifru_newname[IFNAMSIZ];
void __user * ifru_data;
struct if_settings ifru_settings;
} ifr_ifru;
};dom
#define ifr_name ifr_ifrn.ifrn_name /* interface name */
#define ifr_hwaddr ifr_ifru.ifru_hwaddr /* MAC address */
#define ifr_addr ifr_ifru.ifru_addr /* address */
#define ifr_dstaddr ifr_ifru.ifru_dstaddr /* other end of p-p lnk */
#define ifr_broadaddr ifr_ifru.ifru_broadaddr /* broadcast address */
#define ifr_netmask ifr_ifru.ifru_netmask /* interface net mask */
#define ifr_flags ifr_ifru.ifru_flags /* flags */
#define ifr_metric ifr_ifru.ifru_ivalue /* metric */
#define ifr_mtu ifr_ifru.ifru_mtu /* mtu */
#define ifr_map ifr_ifru.ifru_map /* device map */
#define ifr_slave ifr_ifru.ifru_slave /* slave device */
#define ifr_data ifr_ifru.ifru_data /* for use by interface */
#define ifr_ifindex ifr_ifru.ifru_ivalue /* interface index */
#define ifr_bandwidth ifr_ifru.ifru_ivalue /* link bandwidth */
#define ifr_qlen ifr_ifru.ifru_ivalue /* Queue length */
#define ifr_newname ifr_ifru.ifru_newname /* New name */
#define ifr_settings ifr_ifru.ifru_settings /* Device/proto settings*/socket
基本介紹:
ifreq結構定義在/usr/include/net/if.h,用來配置ip地址,激活接口,配置MTU等接口信息的。其中包含了
一個接口的名字和具體內容——(是個共用體,有多是IP地址,廣播地址,子網掩碼,MAC號,MTU或其餘內容)。
ifreq包含在ifconf結構中。而ifconf結構一般是用來保存全部接口的信息的。ui
sockaddr_ll: 表示設備無關的物理層地址結構
struct sockaddr_ll {
unsigned short sll_family; //和sockaddr_in中的sa_family同樣,地址族的意思
__be16 sll_protocol; //表示上層的協議類型
int sll_ifindex; // 表示接口類型
unsigned short sll_hatype; // ARP 硬件地址類型
unsigned char sll_pkttype; //包含分組類型
unsigned char sll_halen; //下面地址長度,精確的解釋依賴於設備
unsigned char sll_addr[8]; //包括物理層(例如 IEEE 802.3)地址。 sll_addr[8] 爲目的MAC地址
}; this
struct dhcpMessage // DHCP信息結構體
{
u_int8_t op; //報文類型, 1 請求報文; 2 迴應報文
u_int8_t htype; //硬件地址類型
u_int8_t hlen; //硬件地址長度 以太網中該值爲 6
u_int8_t hops; //跳數。 客戶端設置爲0,也可被一個代理服務器設置
u_int32_t xid; //事物ID, 該值由客戶端設置並由服務器返回,用來在client和server之間交流請求個響應
u_int16_t secs; //由client填充,表示從客戶端開始得到IP地址或IP地址續借後所使用的秒數
u_int16_t flags; //只有最左邊的一個比特有用,0:單播, 1:廣播
u_int32_t ciaddr; //客戶端的IP 地址。只有client是bound(連接),renew(更新), rebinding(從新綁定)狀態,而且能響應ARP請求是,才能被填充
u_int32_t yiaddr; //client IP地址, 與上面的不太理解,可能使用時狀態不一樣
u_int32_t siaddr; //DHCP協議流程下一個階段要使用的server的IP 地址
u_int32_t giaddr; //DHCP中繼器的IP 地址, //注意: 不是地址中定義的網關
u_int8_t chaddr[16];//硬件客戶端地址。client 必須設置。
u_int8_t sname[64]; //可選的服務器主機名,以空結尾的字符串,由服務器填寫
u_int8_t file[128]; //啓動文件名,由空結尾的字符串,
u_int8_t options[308]; /* 312 - cookie */ //可選參數域,格式爲"代碼 + 長度 + 數據"
};操作系統
------------------------------------------------------------------------------------- 代理
typedef uint32_t in_addr_t;
struct in_addr {
in_addr_t s_addr;
};
-------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------
struct utsname
{ char sysname[_UTSNAME_SYSNAME_LENGTH];//當前操做系統名
char nodename[_UTSNAME_NODENAME_LENGTH];//網絡上的名稱
char release[_UTSNAME_RELEASE_LENGTH];//當前發佈級別
char version[_UTSNAME_VERSION_LENGTH];//當前發佈版本
char machine[_UTSNAME_MACHINE_LENGTH];//當前硬件體系類型
#if _UTSNAME_DOMAIN_LENGTH - 0
/* Name of the domain of this node on the network. */
# ifdef __USE_GNU
char domainname[_UTSNAME_DOMAIN_LENGTH]; //當前域名
# else
char __domainname[_UTSNAME_DOMAIN_LENGTH];
# endif
#endif
};
例子:功能描述:
獲取當前內核名稱和其它信息。
用法:
#include <sys/utsname.h>
extern int uname (struct utsname *__name) __THROW;
返回說明:
成功執行時,返回0。失敗返回-1,errno被設爲EFAULT,表示buf無效。
-------------------------------------------------------------------------------------