A. c语言解析
int a[20]={1,1},i; 是定义一个长度为20的整型数组a,并初始化数组前两项为1,1,还定义了一个整形变量i
for(i=2;i<20;i++) a[i]=a[i–1]+a[i–2]; 是用for循环,让数组里每一项都等于前两项之和。
for(i=0;i<20;i++) printf(i%5==4)printf("\n");是用for循环,输出整个数组
B. C语言程序解析
p 指向 数组a的首地址;
++,-- 的优先级高于*
*p -> a[0] = 1;
*(++p) -> a[1] = 2;
*++p -> a[2] = 3;
*(p--) ->p-- 打印时地址还没改变 ; -> a[2] = 3;
*p++ -> 上次打印结束,指针只想地址改变,回到 a[1] = 2;
*p -> 上次打印结束 , 指针像后面移动,指向 a[2] = 3;
++(*p) -> a[2]=3;的基础上 *p 加 1 =》 4 =》导致 a[2] 的值改为4
*p 上面加一操作, *p 当前指向 a[2] = 4
C. C程序,定义了tcp头,用winpcap抓包后打印包的端口号,结果跟wireshark显示的不同。
这个,你没有说清楚,是不是你用raw socket发送?自己填充的数据?还是你只是用c语言解析tcpmp格式的截包。由于头部并非一成不定,要根据字段先解析ethernet头,然后ip头,然后才是tcp头部。如果不正确,请自己对照数据手工解析一下,看看问题在哪里。
如果你使用python的话,用dpkt和pycap就可以。如果用c#类,也有基于winpcap的包,并且把
解析tcp之类的集成进去了。
D. C语言解析字符串
方法:检测所有“=”和“;”之间的字符串,挺简单的,自己写吧
E. 如何用c语言编写程序读取并显示部分wireshark所抓得数据包内容
1)如果是一些已经有插件可以提取的数据,可以直接使用,比如voip分析这块就可以直接导出G711的音频码流,甚至直接播放
2)如果wireshark还没有插件支持,自己写代码支持,比如用lua插件,或者直接用winpcap 开发包来操纵截包处理。
1)wireshark安装后电子文档chm的,有一章就是专门讲lua写私有协议解析插件的 2)如果采用基于winpcap开发包的模式,可以下载开发包wpdpack,里面附带了很多例子。另外,也有基于net的库,很方便处理的。 这些搞清楚都需要花点时间。
F. 怎么用C语言读取wireshark捕获的数据包,我写了一个,但是总是读不对,不知道是错在哪里
#pragmapack(push,1)
typedefstructpcap_hdr_s{
unsignedintmagic_number;/*magicnumber*/
unsignedshortversion_major;/*majorversionnumber*/
unsignedshortversion_minor;/*minorversionnumber*/
intthiszone;/*GMTtolocalcorrection*/
unsignedintsigfigs;/*accuracyoftimestamps*/
unsignedintsnaplen;/*maxlengthofcapturedpackets,inoctets*/
unsignedintnetwork;/*datalinktype*/
}pcap_hdr_t;
typedefstructpcaprec_hdr_s{
unsignedintts_sec;/*timestampseconds*/
unsignedintts_usec;/*timestampmicroseconds*/
unsignedintincl_len;/**/
unsignedintorig_len;/*actuallengthofpacket*/
}pcaprec_hdr_t;
typedefstruct{
unsignedshortsrc_mac[3];
unsignedshortdst_mac[3];
unsignedshortpkt_type;
}ethernet_hdr_t;
typedefstruct{
unsignedcharhdr_dwcnt:4;
unsignedcharversion:4;
unsignedcharech:2;
unsignedchardscp:6;
unsignedshortlen;
unsignedshortident;
unsignedshortfrag_offset:13;
unsignedshortflags:3;
unsignedcharttl;
unsignedcharproto;
unsignedshortcrc;
unsignedintsrc_addr;
unsignedintdst_addr;
}ipproto_hdr_t;
typedefstruct{
unsignedshortsrcport;
unsignedshortdstport;
unsignedintpktnum;
unsignedintacknum;
unsignedcharflags1:1;
unsignedcharreserved:3;
unsignedcharhdr_dwcnt:4;
unsignedcharflags2:8;
unsignedshortwndsize;
unsignedshortcrc;
unsignedshortptr;
}tcpproto_hdr_t;
#pragmapack(pop)
#include<stdio.h>
#include<stdlib.h>
voidRevert(void*val,intlen)
{
chartmp;
char*sp=(char*)val;
char*ep=sp+len-1;
while(sp<ep){
tmp=*sp;
*sp=*ep;
*ep=tmp;
++sp;
--ep;
}
}
voidMakeIPStr(char*output,unsignedlongnbsaddr)
{
unsignedcharb1,b2,b3,b4;
b1=nbsaddr&0xff;
b2=(nbsaddr>>8)&0xff;
b3=(nbsaddr>>16)&0xff;
b4=(nbsaddr>>24)&0xff;
sprintf(output,"%d.%d.%d.%d",b1,b2,b3,b4);
}
intmain()
{
FILE*fp;
pcap_hdr_tgheader;
fp=fopen("c:\11.pcap","rb");
fread(&gheader,sizeof(gheader),1,fp);
for(;;){
pcaprec_hdr_tpheader;
unsignedchar*pdata;
unsignedchar*ppdata;
if(fread(&pheader,sizeof(pheader),1,fp)==1){
pdata=(unsignedchar*)malloc(pheader.orig_len);
fread(pdata,pheader.orig_len,1,fp);
ppdata=pdata;
/*ethernetheader*/{
ethernet_hdr_t*ethhdr=(ethernet_hdr_t*)ppdata;
Revert(ðhdr->src_mac[0],2);
Revert(ðhdr->src_mac[1],2);
Revert(ðhdr->src_mac[2],2);
Revert(ðhdr->dst_mac[0],2);
Revert(ðhdr->dst_mac[1],2);
Revert(ðhdr->dst_mac[2],2);
Revert(ðhdr->pkt_type,2);
printf("frommac:%04x%04x%04xtomac:%04x%04x%04x ",
ethhdr->src_mac[0],ethhdr->src_mac[1],ethhdr->src_mac[2],
ethhdr->dst_mac[0],ethhdr->dst_mac[1],ethhdr->dst_mac[2]
);
ppdata+=sizeof(*ethhdr);
if(ethhdr->pkt_type==0x800)
/*ipheader*/{
ipproto_hdr_t*iphdr=(ipproto_hdr_t*)ppdata;
charipbuf1[24],ipbuf2[24];
MakeIPStr(ipbuf1,iphdr->src_addr);
MakeIPStr(ipbuf2,iphdr->dst_addr);
printf("addrfrom:%sto%s ",ipbuf1,ipbuf2);
printf("ttl:%d ",iphdr->ttl);
ppdata+=iphdr->hdr_dwcnt*4;
if(iphdr->proto==0x06){/*tcp*/
tcpproto_hdr_t*tcphdr=(tcpproto_hdr_t*)ppdata;
Revert(&tcphdr->srcport,2);
Revert(&tcphdr->dstport,2);
printf("tcp,portfrom%dto%d ",tcphdr->srcport,tcphdr->dstport);
ppdata+=tcphdr->hdr_dwcnt*4;
puts("data:");
/*printdata*/{
intnDataLen=pdata+pheader.orig_len-ppdata;
inti;
for(i=0;i<nDataLen;++i){
printf("%02x",ppdata[i]);
if(i%16==15)puts("");
}
puts("");
}
}
}
puts("");
}
free(pdata);
}else
break;
}
fclose(fp);
return0;
}
真麻烦……
这个给你参考
超文本传输协议冒号两个斜杠wiki点wireshark点org斜杠Development斜杠LibpcapFileFormat
G. c语言中解析IP数据报文
+14就是跳过头部,从第14字节起才是IP协议的报文内容,随便用抓捕器抓一个包,可以看到这部分前导14个字节是源地址和目的地址以及类型,它们不属于IP协议本身。
H. C语言代码解析
你应该还没学指针吧,学了之后这个代码就很好懂了。我先简单说说,你可以把a[100]这个数组看成一个个抽屉,每个抽屉依次有自己的编号。子函数中a+n-1就是a[n-1]的编号值,a即为a[0]的编号,通过编号值找到a[n-1]这个排在最后的抽屉,把它抽出来,然后它之前的抽屉依次后移一格,它再放到第一个,随着抽屉排序的变化,抽屉里存的数的顺序也发生变化。通过m计数,将上述过程重复m次完成。
I. 求一个C语言程序,用来MAc数据帧解析,尤其是数据部的解析
建议你自己写,分都没有,给你写还要网络MAC数据帧,而你却轻松地问个问题。回答1+1似的问题没分还以轻松蹭经验,同样没分为什么要给你写这种有点小麻烦的程序。以后这种问题你有以下解决方法。判断你是否有足够的分?是--->你是否愿意拿出足够的分?是--->在知道提问会有人解答。其他情况你自己写程序,这也是对你自己的锻炼!结果都很完美!