有关于TCP数据包包头包尾的处理

qq_36263849 2016-09-28 02:30:00
我需要接受一个数据包,然后解析该数据包的包头包尾,看是否是所需要的数据包,是的话,num+1,否则继续寻找。然后,我编写的代码不能实现这个功能,所以过来求助。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define PACKET_TCP_ID_HEAD "B8C1"
#define PACKET_TCP_ID_TAIL "76B7"

unsigned char Packet_Filter_TCP(unsigned char Packet[])
{
unsigned char num=0;

unsigned char *p = Packet;
char *Head = NULL;
char *Tail = NULL;

while(1)
{
Head = memchr(p,'B',sizeof(p));
sscanf(Head,"%4s",Head);

if(strcmp(Head,PACKET_TCP_ID_HEAD) == 0)
{
printf("找到了包头\n");

Tail = memchr(p,'7',sizeof(p));
sscanf(Tail,"%4s",Tail);
if(strcmp(Tail,PACKET_TCP_ID_TAIL) == 0)
{
printf("找到了包尾\n");
num++;
}
else
break;
}
else
break;
}

Head = memchr(p,'B',sizeof(p));
sscanf(Head,"%4s",Head);

if(strcmp(Head,PACKET_TCP_ID_HEAD) == 0)
{
printf("找到了包头\n");
Tail = memchr(p,'7',sizeof(p));
sscanf(Tail,"%4s",Tail);
if(strcmp(Tail,PACKET_TCP_ID_TAIL) == 0)
{
printf("找到了包尾\n");
num++;
}
else
return 0;
}
else
return 0;

return num;
}

int main()
{
int num;
unsigned char Packedt[] = "B8C176B71827063516376B7B8C11827063516376B7B8C11827063516376B7";
num = Packet_Filter_TCP(Packedt);
printf("传送了%d个数据包",num);

return 0;
}
...全文
933 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2016-09-29
  • 打赏
  • 举报
回复
不知道有多少前人掉在TCP Socket send(人多)send(病少)send(财富) recv(人多病)recv(少财富) 陷阱里面啊! http://bbs.csdn.net/topics/380167545
luciferisnotsatan 2016-09-29
  • 打赏
  • 举报
回复
sizeof(p) 得到的只是指针大小,改用strlen。 实际的数据包不是可打印字符串,你需要解析数据包的结构来知道多大
ipqtjmqj 2016-09-29
  • 打赏
  • 举报
回复
你可以用c++吗,可以的话,直接用string的find方法就可以了
HymanLiuTS 2016-09-28
  • 打赏
  • 举报
回复
sizeof应该换成strlen,才能代表整个字符串-长度。你这里求HEAD,TAIL的方法有问题,至少求尾部TAIL时,应该从后向前搜索。在手机上,没运行代码,仅供参考。

64,646

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧