"+++++++++++++++++++++++++ Linux TCP/UDP通信中的结构体 +++++++++++++++++++++++++++++++++++++++"

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结构定义在/usr/include/net/if.h,用来配置ip地址,激活接口,配置MTU等接口信息的。其中包含了
一个接口的名字和具体内容——(是个共用体,有可能是IP地址,广播地址,子网掩码,MAC号,MTU或其他内容)。
ifreq包含在ifconf结构中。而ifconf结构通常是用来保存所有接口的信息的。

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地址
};

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无效。

-------------------------------------------------------------------------------------

转载于:https://www.cnblogs.com/yyx1-1/p/6531282.html

Linux中网络通信中 使用的结构体相关推荐

  1. c语言结构体数组存入文件_关于从文件中读取数据并写入结构体数组

    已结贴√ 问题点数:25 回复次数:10 关于从文件中读取数据并写入结构体数组 各位大大好,本人新手一枚,最近写简单的通讯录的c程序,其他功能完好,最后一个将txt文件中的数据写入结构体数组的函数无法 ...

  2. 【Struct(结构体)杂谈之三】借我一双慧眼吧,让我把C++中Class(类)和Struct(结构体)看个清清楚楚明明白白...

    C++中Class(类)和Struct(结构体)的区别 之前一篇我们了解了C++中Struct的定义方法和C中有点不一样,而且增加了一种新的类型---Class.从 C++的名字我们就可以知道,C++ ...

  3. OS / Linux / 文件描述符以及 file 结构体

    零.前言 程序可以理解为硬盘上的普通二进制文件:进程是加载到内存中的二进制文件,除了加载到内存中的二进制文件外,还附有所有对于该二进制文件描述信息的结构体,描述该进程的结构体叫PCB(进程控制块),在 ...

  4. Linux进程描述符task struct结构体详解--Linux进程的管理与调度(一)

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 日期 内 ...

  5. Linux 物理内存管理涉及的三大结构体之struct zone

    从Linux 物理内存管理涉及的三大结构体之struct page 中,大概知道了UMA和NUMA概念,同时也知道在每个node对应的内存范围内,都会将其分成不同的内存管理区域zone.之所以分成几类 ...

  6. Linux内核中的PCB里面task_struct结构体中的具体信息

    1.PCB进程控制块--->task_struct 广义上,所有的进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合. 每个进程在内核中都有一个进程控制块来维护进程的相关信息 ...

  7. 内核中用于数据接收的结构体struct msghdr

    我们从一个实际的数据包发送的例子入手,来看看其发送的具体流程,以及过程中涉及到的相关数据结构.在我们的虚拟机上发送icmp回显请求包,ping另一台主机172.16.48.1.我们使用系统调用send ...

  8. ios开发中的C语言学习—— 结构体简介

    在开发过程中,经常会需要处理一组不同类型的数据,比如学生的个人信息,由姓名.年龄.性别.身高等组成,因为这些数据是由不同数据类型组成的,因此不能用数组表示,对于不同数据类型的一组数据,可以采用结构体来 ...

  9. 内核中用于数据接收的结构体struct msghdr以及iovec介绍

    我们从一个实际的数据包发送的例子入手,来看看其发送的具体流程,以及过程中涉及到的相关数据结构.在我们的虚拟机上发送icmp回显请求包,ping另一台主机172.16.48.1.我们使用系统调用send ...

最新文章

  1. 使用Intellij Idea 创建一个Web项目!
  2. 五分钟入门文本处理三剑客grep awk sed
  3. 《Java技术》第九次作业计科1501赵健宇-IO
  4. mysql y_关于MySQL中Y和~问题
  5. 一个数等于两个不同素数的乘机_相亲数:数字所表达的友情和浪漫
  6. Linux中的readelf命令
  7. 全自动采集程序 php,快看CMS全自动采集影视程序
  8. 计算机共享文件夹不要用户名密码怎么设置,Win7电脑怎么设置不用密码也能访问共享文件?...
  9. 峰哥建议你要多「旷课」
  10. ECharts+Vue实现数据可视化
  11. 用Python手把手教你做一只口红色号识别器,秒变李佳琦
  12. openmv和stm32串口通信完成二维码识别
  13. 【概率题汇总】互联网公司概率面试题整理
  14. 电影天堂影片下载地址获取
  15. python爬微博数据合法吗_GitHub - ChaliceRunRunRun/weibo-crawler: 新浪微博爬虫,用python爬取新浪微博数据...
  16. NXP----PF8100-PF8200芯片layout设计总结
  17. NFVA35065L32 IGBT 650V 汽车智能功率模块 (ASPM) 特征
  18. 计算着色器(Compute Shaders)
  19. 100集华为HCIE安全培训视频教材整理 | 双机热备(九)
  20. android 调试笔记

热门文章

  1. GDCM:gdcm::DataSet的测试程序
  2. 测试lazy_enable_if的所有变体
  3. ITK:在图像上叠加标签图
  4. OpenCV LATCH Matching描述符匹配算法的实例(附完整代码)
  5. OpenCV各向异性图像分割anisotropic image segmentation的实例(附完整代码)
  6. OpenGL Single Point单点移动三角形的实例
  7. OpenGL 几何着色器细分的实例
  8. memcpy和strcpy的区别 ?
  9. QT的QDomAttr类的使用
  10. 看代码的软件_软件著作权申请中常见的补正问题及解决方式