Linux中网络通信中 使用的结构体
"+++++++++++++++++++++++++ Linux TCP/UDP通信中的結(jié)構(gòu)體 +++++++++++++++++++++++++++++++++++++++"
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;
}
/*
* 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;
};
#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*/
基本介紹:
ifreq結(jié)構(gòu)定義在/usr/include/net/if.h,用來(lái)配置ip地址,激活接口,配置MTU等接口信息的。其中包含了
一個(gè)接口的名字和具體內(nèi)容——(是個(gè)共用體,有可能是IP地址,廣播地址,子網(wǎng)掩碼,MAC號(hào),MTU或其他內(nèi)容)。
ifreq包含在ifconf結(jié)構(gòu)中。而ifconf結(jié)構(gòu)通常是用來(lái)保存所有接口的信息的。
?
sockaddr_ll: 表示設(shè)備無(wú)關(guān)的物理層地址結(jié)構(gòu)
struct sockaddr_ll {
unsigned short sll_family; //和sockaddr_in中的sa_family一樣,地址族的意思
__be16 sll_protocol; //表示上層的協(xié)議類型
int sll_ifindex; // 表示接口類型
unsigned short sll_hatype; // ARP 硬件地址類型
unsigned char sll_pkttype; //包含分組類型
unsigned char sll_halen; //下面地址長(zhǎng)度,精確的解釋依賴于設(shè)備
unsigned char sll_addr[8]; //包括物理層(例如 IEEE 802.3)地址。 sll_addr[8] 為目的MAC地址
};
?
?
struct dhcpMessage // DHCP信息結(jié)構(gòu)體
{
u_int8_t op; //報(bào)文類型, 1 請(qǐng)求報(bào)文; 2 回應(yīng)報(bào)文
u_int8_t htype; //硬件地址類型
u_int8_t hlen; //硬件地址長(zhǎng)度 以太網(wǎng)中該值為 6
u_int8_t hops; //跳數(shù)。 客戶端設(shè)置為0,也可被一個(gè)代理服務(wù)器設(shè)置
u_int32_t xid; //事物ID, 該值由客戶端設(shè)置并由服務(wù)器返回,用來(lái)在client和server之間交流請(qǐng)求個(gè)響應(yīng)
u_int16_t secs; //由client填充,表示從客戶端開(kāi)始獲得IP地址或IP地址續(xù)借后所使用的秒數(shù)
u_int16_t flags; //只有最左邊的一個(gè)比特有用,0:單播, 1:廣播
u_int32_t ciaddr; //客戶端的IP 地址。只有client是bound(鏈接),renew(更新), rebinding(重新綁定)狀態(tài),并且能響應(yīng)ARP請(qǐng)求是,才能被填充
u_int32_t yiaddr; //client IP地址, 與上面的不太理解,可能使用時(shí)狀態(tài)不同
u_int32_t siaddr; //DHCP協(xié)議流程下一個(gè)階段要使用的server的IP 地址
u_int32_t giaddr; //DHCP中繼器的IP 地址, //注意: 不是地址中定義的網(wǎng)關(guān)
u_int8_t chaddr[16];//硬件客戶端地址。client 必須設(shè)置。
u_int8_t sname[64]; //可選的服務(wù)器主機(jī)名,以空結(jié)尾的字符串,由服務(wù)器填寫(xiě)
u_int8_t file[128]; //啟動(dòng)文件名,由空結(jié)尾的字符串,
u_int8_t options[308]; /* 312 - cookie */ //可選參數(shù)域,格式為"代碼 + 長(zhǎng)度 + 數(shù)據(jù)"
};
?
-------------------------------------------------------------------------------------?
typedef uint32_t in_addr_t;
struct in_addr {
in_addr_t s_addr;
};
-------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------
?struct utsname
? { char sysname[_UTSNAME_SYSNAME_LENGTH];//當(dāng)前操作系統(tǒng)名
?? char nodename[_UTSNAME_NODENAME_LENGTH];//網(wǎng)絡(luò)上的名稱
?? char release[_UTSNAME_RELEASE_LENGTH];//當(dāng)前發(fā)布級(jí)別
?? char version[_UTSNAME_VERSION_LENGTH];//當(dāng)前發(fā)布版本
?? char machine[_UTSNAME_MACHINE_LENGTH];//當(dāng)前硬件體系類型
#if _UTSNAME_DOMAIN_LENGTH - 0
??? /* Name of the domain of this node on the network.? */
# ifdef __USE_GNU
??? char domainname[_UTSNAME_DOMAIN_LENGTH]; //當(dāng)前域名
# else
??? char __domainname[_UTSNAME_DOMAIN_LENGTH];
# endif
#endif
? };
例子:功能描述:?
獲取當(dāng)前內(nèi)核名稱和其它信息。
用法:?
#include <sys/utsname.h>
extern int uname (struct utsname *__name) __THROW;
返回說(shuō)明:?
成功執(zhí)行時(shí),返回0。失敗返回-1,errno被設(shè)為EFAULT,表示buf無(wú)效。
?
?
-------------------------------------------------------------------------------------
轉(zhuǎn)載于:https://www.cnblogs.com/yyx1-1/p/6531282.html
總結(jié)
以上是生活随笔為你收集整理的Linux中网络通信中 使用的结构体的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: scikit-learn 入门
- 下一篇: Java中的List