1.网络编程在自己定义结构体实现协议的时候,一定要注意字节对齐这个问题。否则sizeof和强制转换指针的时候都会出现很难发现的bug。

什么是字节对齐自行百度。

 #pragma pack (1)//字节对齐的控制!非常注意!
//定义一个以太网头部
typedef struct ehhdr { UCHAR eh_dst[]; /* destination ethernet addrress */ UCHAR eh_src[]; /* source ethernet addresss */ USHORT eh_type; /* ethernet pachet type */ }ETHERHEAD; //28字节的ARP请求/应答 typedef struct arphdr { USHORT arp_hrd; /* format of hardware address */ USHORT arp_pro; /* format of protocol address */ UCHAR arp_hln; /* length of hardware address */ UCHAR arp_pln; /* length of protocol address */ USHORT arp_op; /* ARP/RARP operation */ UCHAR arp_sha[]; /* sender hardware address */ ULONG arp_spa; /* sender protocol address */ UCHAR arp_tha[]; /* target hardware address */ ULONG arp_tpa; /* target protocol address */ }ARPHEAD; #pragma pack ()//字节对齐的控制

2. 注意网络字节序和本机字节序的转换。使用ntohs()等函数。下面是一个winpcap回调函数的例子,用来检测本机是否在进行ARP扫描,对代码有任何建议欢迎指出交流。

 void packet_handler_ARP(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data)
{
struct tm *ltime;
ltime = new struct tm;
char timestr[];
time_t local_tv_sec;
time_t tTimer = time();
static unsigned short nNum; if ( tTimer - g_tStartTimer > SNIFF_TIME)//计时嗅探时间
pcap_breakloop(g_OpenDev); /* 将时间戳转换成可识别的格式 */
local_tv_sec = header->ts.tv_sec;
localtime_s(ltime, &local_tv_sec);
strftime( timestr, sizeof timestr, "%H:%M:%S", ltime); printf("%s,%.6d len:%d\n", timestr, header->ts.tv_usec, header->len); //嗅探自己是否发出了ARP
ETHERHEAD *pEtherHead = NULL;
pEtherHead = (ETHERHEAD*)pkt_data;
if ( strncmp((const char*)(pEtherHead->eh_src), (const char*)(g_aMac), ) == ) {//检测源地址是否是本机
ARPHEAD *pARPHead = NULL;
//printf ("是本机发出的ARP数据");
pARPHead = (ARPHEAD*)(pkt_data + sizeof(ETHERHEAD));
if (ntohs (pARPHead->arp_pro) == 0x0800 &&//IP
ntohs(pARPHead->arp_op) == 0x0001 &&//ARP Request
(ntohl(pARPHead->arp_tpa) & 0xffff0000)== 0xc0a80000 ) {//是ARP请求内网IP
nNum ++;
//printf ("计数+1\n");
if (nNum > WARN_NUM) {//计数超过了阈值参数
g_bWarning = true;
pcap_breakloop(g_OpenDev);
}
}
} }

C/C++网络编程时注意的问题小结的更多相关文章

  1. UNIX网络编程——TCP带外数据小结

    带外数据概念实际上时向接收端传送三个不同的信息:(1)发送端进入紧急模式这个事实.接收进程得以通知这个事实的手段不外乎SIGURG信号或select调用.本通知在发送进程发送带外字节后由发送端TCP立 ...

  2. python之网络编程

    本地的进程间通信(IPC)有很多种方式,但可以总结为下面4类: 消息传递(管道.FIFO.消息队列) 同步(互斥量.条件变量.读写锁.文件和写记录锁.信号量) 共享内存(匿名的和具名的) 远程过程调用 ...

  3. 黑马程序员:Java编程_网络编程

    =========== ASP.Net+Android+IOS开发..Net培训.期待与您交流!=========== 网络编程就是两个(或多个)设备(例如计算机)之间的数据传输,更具体的说,网络编程 ...

  4. 黑马程序员_Java基础:网络编程总结

    ------- android培训.java培训.期待与您交流! ---------- Java语言是在网络环境下诞生的,它是第一个完全融入网络的语言,虽然不能说它是对支持网络编程做得最好的语言,但是 ...

  5. JAVA的网络编程

    网络编程 网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无法进入网络编程的大门而放弃了对于该部分技术的学习. 在 学习网络编程以前,很多初学者可能觉得网络编 ...

  6. 物联网网络编程、Web编程综述

    本文是基于嵌入式物联网研发工程师的视觉对网络编程和web编程进行阐述.对于专注J2EE后端服务开发的童鞋们来说,这篇文章可能稍显简单.但是网络编程和web编程对于绝大部分嵌入式物联网工程师来说是一块真 ...

  7. 【Linux/unix网络编程】之使用socket进行TCP编程

    实验一 TCP数据发送与接收 [实验目的] 1.熟练掌握套接字函数的使用方法. 2.应用套接字函数完成基本TCP通讯,实现服务器与客户端的信息交互. [实验学时] 4学时 [实验内容] 实现一个服务器 ...

  8. JAVA网络编程【转】出处不详

    网络编程 网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无法进入网络编程的大门而放弃了对于该部分技术的学习. 在 学习网络编程以前,很多初学者可能觉得网络编 ...

  9. 【转】JAVA之网络编程

    转自:火之光 网络编程 网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无法进入网络编程的大门而放弃了对于该部分技术的学习. 在 学习网络编程以前,很多初学者 ...

随机推荐

  1. [Grid Layout] Use the repeat function to efficiently write grid-template values

    We can use the repeat() function if we have repeating specifications for columns and rows. With the  ...

  2. [Angular] Using the platform agnostic Renderer & ElementRef

    ElementRef: ElementRef is a way to access native html element, notice that it only works for Broswer ...

  3. OOA/OOD/OOP 转载

    OOA/OOD/OOP OOA Object-Oriented Analysis:面向对象分析方法 是在一个系统的开发过程中进行了系统业务调查以后,按照面向对象的思想来分析问题.OOA与结构化分析有较 ...

  4. 小强的HTML5移动开发之路(32)—— JavaScript回顾7

    BOM模型brower object model(浏览器对象模型),通过浏览器内置的一些对象可以操作浏览器本身. DOM是用来操作页面的,BOM是用来操作浏览器本身的. BOM是没有规范的,但是大部分 ...

  5. ITFriend创业败局(一):选择创业方向和寻找合伙人,创业失败的2个关键点

         这次创业惨淡收场,最主要的原因是没有选择一个合适的创业方向,没有找到合适的创业合伙人. 首先要说到创业方向,因为不同的创业方向需要组建不同的创业团队.我个人比较偏好,软件.网络.互联网等有一 ...

  6. 【先进的算法】Lasvegas算法3SAT问题(C++实现代码)

    转载请注明出处:http://blog.csdn.net/zhoubin1992/article/details/46469557 1.SAT问题描写叙述 命题逻辑中合取范式 (CNF) 的可满足性问 ...

  7. ios 即时通讯开源IM,LeanCloud、融云、环信

    环信官网链接: http://easemob.com/docs/ios/

  8. radio选择事件 onchange事件 onclick事件

    单选框按钮(radio)选择事件怎么设置呢? 既可以在radio标签里设置onclick事件实现,也可以设置它的onchange事件实现,效果一样,代码如下: <input id="r ...

  9. 【p094】道路游戏

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] 小新正在玩一个简单的电脑游戏. 游戏中有一条环形马路,马路上有n个机器人工厂,两个相邻机器人工厂之间由 ...

  10. C# WinForm开发系列 - Report

    http://www.cnblogs.com/peterzb/archive/2009/07/11/1521331.html