用 winsock的 api 捕获的网络数据包,怎么区分啊
是tcp还是udp
是tcp还是udp
解决方案 »
- 大家好,我建立了一个ATL的项目,怎样让其他客户端通过远程可以使用呢?
- MFC图形处理
- 求能实时查看其它进程内存的工具,就像VC调试时那个Memory框一样
- 有关DEF文件和extern "C"
- 我想做一个位图按扭,但我不想从资源中装载位图ID,而想直接从位图文件装载,不知各位大师有什么方法?这样可以避免应用程序太大
- 美男裸求CList解决方法~~~~~~
- GetIfEntry函数得到的网络流量不对,大侠救命,怎样得到本地的网络流量。(急,分不是问题)
- 函数前面加上static 有什么作用呢?
- 分析html文件出问题
- 请教一个简单编译链接出错问题!
- 一个简单的问题请教。
- 我也建了个群20836124大家进啊,多多交流啊!!
两个包格式不一样的
IP 为定义的结构体,是ip 数据包头;
TCP 为定义的结构体,是tcp 数据包头 IP ip = *(IP*)RecvBuf; TCP tcp = *(TCP*)(RecvBuf-ip.HdrLen);//???? 有错误么?
当它的值为6时,表示这个数据包是TCP的,当为17时是UDP的
所以使用Raw Socket接收IP数据包,在分析IP包载荷中封着的是不是TCP包
普通的套接字只能接收到用户层的数据包,也就是已脱了各协议头的数据包
你可以看看windows网络编程技术的13章,专讲原始套接字的
UDP和TCP都是IP包你要区别IP包和TCP干什么?。。
具体程序刚才楼上提到,可以看《windows网络编程技术》
比如说,里面纯粹就是一个数据;
按照IP协议分析就可以了
struct IP_HEADER
{
byte ver_len; //版本4位,头长度4位,报头长度以32位为一个单位
byte type; //类型8位
byte length[2]; //总长度,16位,指出报文的以字节为单位的总长度,报文长度不能超过65536个字接,否则认为报文遭到破坏
byte id[2]; //报文标示,用于多于一个报文16位
byte flag_offset[2];//标志,3位 数据块偏移13位
byte time; //生存时间,8位
byte protocol; //协议,8位
byte crc_val[2]; //头校验和,16位
byte src_addr[4]; //源地址,32位
byte des_addr[4]; //目标地址,32位
byte options[4]; //选项和填充,32位
};#define ICMP 1 //控制信息协议
#define TCP 6 //传输控制协议
#define EGP 8 //外部网关协议
#define IGP 9 //内部网关协议
#define UDP 17 //用户数据报协议明白了吗?
根据IP_HEADER.protocol的值判断ip包中的数据部分到底是什么协议
MAC层再往上传,可能传到IP层,也可能传到别的协议
把ip包+以太网的帧头,是这样吧?
因为Socket接收到的时候已经把以太网的帧头剥掉了