C/C++网络编程时注意的问题小结
时间:2022-05-08
本文章向大家介绍C/C++网络编程时注意的问题小结,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
1.网络编程在自己定义结构体实现协议的时候,一定要注意字节对齐这个问题。否则sizeof和强制转换指针的时候都会出现很难发现的bug。
什么是字节对齐自行百度。
1 #pragma pack (1)//字节对齐的控制!非常注意!
2 //定义一个以太网头部
3 typedef struct ehhdr
4
5 {
6
7 UCHAR eh_dst[6]; /* destination ethernet addrress */
8
9 UCHAR eh_src[6]; /* source ethernet addresss */
10
11 USHORT eh_type; /* ethernet pachet type */
12
13 }ETHERHEAD;
14
15 //28字节的ARP请求/应答
16
17 typedef struct arphdr
18
19 {
20
21 USHORT arp_hrd; /* format of hardware address */
22
23 USHORT arp_pro; /* format of protocol address */
24
25 UCHAR arp_hln; /* length of hardware address */
26
27 UCHAR arp_pln; /* length of protocol address */
28
29 USHORT arp_op; /* ARP/RARP operation */
30
31 UCHAR arp_sha[6]; /* sender hardware address */
32
33 ULONG arp_spa; /* sender protocol address */
34
35 UCHAR arp_tha[6]; /* target hardware address */
36
37 ULONG arp_tpa; /* target protocol address */
38
39 }ARPHEAD;
40
41 #pragma pack ()//字节对齐的控制
2. 注意网络字节序和本机字节序的转换。使用ntohs()等函数。下面是一个winpcap回调函数的例子,用来检测本机是否在进行ARP扫描,对代码有任何建议欢迎指出交流。
1 void packet_handler_ARP(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data)
2 {
3 struct tm *ltime;
4 ltime = new struct tm;
5 char timestr[16];
6 time_t local_tv_sec;
7 time_t tTimer = time(0);
8 static unsigned short nNum;
9
10 if ( tTimer - g_tStartTimer > SNIFF_TIME)//计时嗅探时间
11 pcap_breakloop(g_OpenDev);
12
13 /* 将时间戳转换成可识别的格式 */
14 local_tv_sec = header->ts.tv_sec;
15 localtime_s(ltime, &local_tv_sec);
16 strftime( timestr, sizeof timestr, "%H:%M:%S", ltime);
17
18 printf("%s,%.6d len:%dn", timestr, header->ts.tv_usec, header->len);
19
20 //嗅探自己是否发出了ARP
21 ETHERHEAD *pEtherHead = NULL;
22 pEtherHead = (ETHERHEAD*)pkt_data;
23 if ( strncmp((const char*)(pEtherHead->eh_src), (const char*)(g_aMac), 6) == 0) {//检测源地址是否是本机
24 ARPHEAD *pARPHead = NULL;
25 //printf ("是本机发出的ARP数据");
26 pARPHead = (ARPHEAD*)(pkt_data + sizeof(ETHERHEAD));
27 if (ntohs (pARPHead->arp_pro) == 0x0800 &&//IP
28 ntohs(pARPHead->arp_op) == 0x0001 &&//ARP Request
29 (ntohl(pARPHead->arp_tpa) & 0xffff0000)== 0xc0a80000 ) {//是ARP请求内网IP
30 nNum ++;
31 //printf ("计数+1n");
32 if (nNum > WARN_NUM) {//计数超过了阈值参数
33 g_bWarning = true;
34 pcap_breakloop(g_OpenDev);
35 }
36 }
37 }
38
39
40 }
- 【java开发系列】—— JDOM创建、修改、删除、读取XML文件
- AngularJs ng-route路由详解
- JAVA获取txt文件内容
- 关于 CSS 反射倒影的研究思考
- 【Javascript】—— 1 方法function的高级特性
- Oracle基础知识-SQL简单命令
- 【java开发系列】—— spring简单入门示例
- JavaMelody应用监控使用指南
- 记录安装oracle的那些事(四)之oracle 缺包安包
- 【面试虐菜】—— JAVA面试题(1)
- JAVA增删改查XML文件
- javascript去掉字符串前后空格
- 构建通用的 React 和 Node 应用
- 有趣的 CSS 像素艺术
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Linux 如何手动释放Swap、Buffer和Cache
- 浙大版《C语言程序设计(第3版)》题目集 练习4-6 猜数字游戏
- 浙大版《C语言程序设计(第3版)》题目集 练习4-7 求e的近似值
- TypeScript高级类型备忘录(附示例)
- 浙大版《C语言程序设计(第3版)》题目集 练习4-10 找出最小值
- 牛逼!力挺一款实用的 Linux 资源监视工具
- 浙大版《C语言程序设计(第3版)》题目集 练习4-11 统计素数并求和
- 浙大版《C语言程序设计(第3版)》题目集 习题4-1 求奇数和
- Kotlin 使用DSL构建语法结构 看这一篇就够了~
- 浙大版《C语言程序设计(第3版)》题目集 习题4-2 求幂级数展开的部分和
- 2020 年 9 月编程语言排行榜
- 浙大版《C语言程序设计(第3版)》题目集 习题4-3 求分数序列前N项和
- 浙大版《C语言程序设计(第3版)》题目集 习题4-4 特殊a串数列求和
- 一个可能让你的页面渲染速度提升数倍的CSS属性
- 浙大版《C语言程序设计(第3版)》题目集 习题4-6 水仙花数