导航:首页 > 净水问答 > C语言数据包过滤

C语言数据包过滤

发布时间:2022-06-10 00:34:25

❶ C语言: 如何实现从数组A里面,过滤掉任意数量的元素,然后将剩余的元素,复制到数组B 详细点

这个比较容易。抄
首先你数组的大小你自己知道,就假设容量A、B为100吧;
其次你需要一个指向A的指针;
再次假设你需要过滤A中50个元素,你得知道从什么位置开始过滤吧;
的判断过滤的位置加上过滤的数量超过总量没有吧。
指针不断++;复制值到B中,知道遇到过滤的开始的位置。指针继续++,将要过滤的数量的值一一跳过,不复制进入B.

❷ c语言初学 如何过滤字符串中除了字母与数字中的字符 例如我输入123abcABC!@#123 输

只能说找出数字0到9和字母a到z,这个得用到字符串函数(比如char *strpbrk(char *str1, char *str2);),因为专在编程语言中,只认字属符,而你所提到的其他符号都是字符,计算机是无法区别的。

❸ 请教C语言 如何滤除采集回来跳变的数据,如何判断采集回来的数据是增大还是减小

1)去除异常(随机噪声)值
按描述,估计采集的是缓变信号。如果是的话,可以采用均值法滤波:求前N-1次采集值的均值后,与最近一次采集值比较(求差值),如果差值超过一定范围,则丢弃;否则保留。
2)判断递增递减
比较理想的方法是利用最近采集的N点数据做样条函数y=x(t),可以是二次样条或三次样条,具体采用几次样条,同样要有被测信号特性决定。然后再对样条函数求导(dy/dt )即可判断出递增递减趋势。点数值N大于等4个比较合适

❹ 怎样用C语言实现网络抓包

  1. 第一法则:站在巨人肩膀上 && 不要重复造轮子。

    对于这种复杂的过程,第一选择是使用现成的,节约时间,提升效率。

    Wireshark(前称Ethereal)是一个网络封包分析软件。网络封包分析软件的功能是撷取网络封包,并尽可能显示出最为详细的网络封包资料。Wireshark使用WinPCAP作为接口,直接与网卡进行数据报文交换。
    网络封包分析软件的功能可想像成 "电工技师使用电表来量测电流、电压、电阻" 的工作 - 只是将场景移植到网络上,并将电线替换成网络线。在过去,网络封包分析软件是非常昂贵,或是专门属于营利用的软件。Ethereal的出现改变了这一切。在GNUGPL通用许可证的保障范围底下,使用者可以以免费的代价取得软件与其源代码,并拥有针对其源代码修改及客制化的权利。Ethereal是目前全世界最广泛的网络封包分析软件之一。

  2. 第二法则:学习 && 提升。

    如果是单纯的学习知识,可以直接尝试写一些具有部分功能的程序,过程会有点艰难,但非常有意义。学习网络编程,需要了解 开放系统互连参考模型的的七层每一层的意义以及现实当中实现的四层的网络协议。然后就可以知道抓包的包位于模型当中的传输层协议,包括UDP和TCP的协议。进一步要学习每种协议的格式,表头,数据包等等。一句话,冰冻三尺非一日之寒。

  3. Windows下的抓包及简单的编程。

    Windows2000在TCP/IP协议组件上做了很多改进,功能也有增强。比如在协议栈上的调整,增大了默认窗口大小,以及高延迟链接新算法。同时在安全性上,可应用IPSec加强安全性,比NT下有不少的改进。
    Microsoft TCP/IP 组件包含“核心协议”、“服务”及两者之间的“接口”。传输驱动程序接口 (TDI) 与网络设备接口规范 (NDIS) 是公用的。 此外,还有许多用户模型应用程序的更高级接口。最常用的接口是 Windows Sockets、远程过程调用 (RPC) 和 NetBIOS。
    Windows Sockets 是一个编程接口,它是在加州大学伯克利分校开发的套接字接口的基础上定义的。它包括了一组扩展件,以充分利用 Microsoft Windows 消息驱动的特点。规范的 1.1 版是在 1993 年 1 月发行的,2.2.0 版在 1996 年 5 月发行。Windows 2000 支持 Winsock 2.2 版。在Winsock2中,支持多个传输协议的原始套接字,重叠I/O模型、服务质量控制等。
    这里介绍Windows Sockets的一些关于原始套接字(Raw Socket)的编程。同Winsock1相比,最明显的就是支持了Raw Socket套接字类型,通过原始套接字,我们可以更加自如地控制Windows下的多种协议,而且能够对网络底层的传输机制进行控制。
    1、创建一个原始套接字,并设置IP头选项。

    SOCKET sock;
    sock = socket(AF_INET,SOCK_RAW,IPPROTO_IP);
    或者:
    s = WSASoccket(AF_INET,SOCK_RAW,IPPROTO_IP,NULL,0,WSA_FLAG_OVERLAPPED);
    这里,我们设置了SOCK_RAW标志,表示我们声明的是一个原始套接字类型。创建原始套接字后,IP头就会包含在接收的数据中,如果我们设定 IP_HDRINCL 选项,那么,就需要自己来构造IP头。注意,如果设置IP_HDRINCL 选项,那么必须具有 administrator权限,要不就必须修改注册表:
    HKEY_LOCAL_
    修改键:DisableRawSecurity(类型为DWORD),把值修改为 1。如果没有,就添加。
    BOOL blnFlag=TRUE;
    setsockopt(sock, IPPROTO_IP, IP_HDRINCL, (char *)&blnFlag, sizeof(blnFlag);
    对于原始套接字在接收数据报的时候,要注意这么几点:
    a、如果接收的数据报中协议类型和定义的原始套接字匹配,那么,接收的所有数据就拷贝到套接字中。
    b、如果绑定了本地地址,那么只有接收数据IP头中对应的远端地址匹配,接收的数据就拷贝到套接字中。
    c、如果定义的是外部地址,比如使用connect(),那么,只有接收数据IP头中对应的源地址匹配,接收的数据就拷贝到套接字中。


    2、构造IP头和TCP头
    这里,提供IP头和TCP头的结构:
    // Standard TCP flags
    #define URG 0x20
    #define ACK 0x10
    #define PSH 0x08
    #define RST 0x04
    #define SYN 0x02
    #define FIN 0x01
    typedef struct _iphdr //定义IP首部
    {
    unsigned char h_lenver; //4位首部长度+4位IP版本号
    unsigned char tos; //8位服务类型TOS
    unsigned short total_len; //16位总长度(字节)
    unsigned short ident; //16位标识
    unsigned short frag_and_flags; //3位标志位
    unsigned char ttl; //8位生存时间 TTL
    unsigned char proto; //8位协议 (TCP, UDP 或其他)
    unsigned short checksum; //16位IP首部校验和
    unsigned int sourceIP; //32位源IP地址
    unsigned int destIP; //32位目的IP地址
    }IP_HEADER;

    typedef struct psd_hdr //定义TCP伪首部
    {
    unsigned long saddr; //源地址
    unsigned long daddr; //目的地址
    char mbz;
    char ptcl; //协议类型
    unsigned short tcpl; //TCP长度
    }PSD_HEADER;

    typedef struct _tcphdr //定义TCP首部
    {
    USHORT th_sport; //16位源端口
    USHORT th_dport; //16位目的端口
    unsigned int th_seq; //32位序列号
    unsigned int th_ack; //32位确认号
    unsigned char th_lenres; //4位首部长度/6位保留字
    unsigned char th_flag; //6位标志位
    USHORT th_win; //16位窗口大小
    USHORT th_sum; //16位校验和
    USHORT th_urp; //16位紧急数据偏移量
    }TCP_HEADER;

    TCP伪首部并不是真正存在的,只是用于计算检验和。校验和函数:

    USHORT checksum(USHORT *buffer, int size)
    {
    unsigned long cksum=0;
    while (size > 1)
    {
    cksum += *buffer++;
    size -= sizeof(USHORT);
    }
    if (size)
    {
    cksum += *(UCHAR*)buffer;
    }
    cksum = (cksum >> 16) + (cksum & 0xffff);
    cksum += (cksum >>16);
    return (USHORT)(~cksum);
    }

    当需要自己填充IP头部和TCP头部的时候,就同时需要自己计算他们的检验和。

    3、发送原始套接字数据报

    填充这些头部稍微麻烦点,发送就相对简单多了。只需要使用sendto()就OK。

    sendto(sock, (char*)&tcpHeader, sizeof(tcpHeader), 0, (sockaddr*)&addr_in,sizeof(addr_in));

    下面是一个示例程序,可以作为SYN扫描的一部分。

    #include <stdio.h>
    #include <winsock2.h>
    #include <ws2tcpip.h>

    #define SOURCE_PORT 7234
    #define MAX_RECEIVEBYTE 255

    typedef struct ip_hdr //定义IP首部
    {
    unsigned char h_verlen; //4位首部长度,4位IP版本号
    unsigned char tos; //8位服务类型TOS
    unsigned short total_len; //16位总长度(字节)
    unsigned short ident; //16位标识
    unsigned short frag_and_flags; //3位标志位
    unsigned char ttl; //8位生存时间 TTL
    unsigned char proto; //8位协议 (TCP, UDP 或其他)
    unsigned short checksum; //16位IP首部校验和
    unsigned int sourceIP; //32位源IP地址
    unsigned int destIP; //32位目的IP地址
    }IPHEADER;

    typedef struct tsd_hdr //定义TCP伪首部
    {
    unsigned long saddr; //源地址
    unsigned long daddr; //目的地址
    char mbz;
    char ptcl; //协议类型
    unsigned short tcpl; //TCP长度
    }PSDHEADER;

    typedef struct tcp_hdr //定义TCP首部
    {
    USHORT th_sport; //16位源端口
    USHORT th_dport; //16位目的端口
    unsigned int th_seq; //32位序列号
    unsigned int th_ack; //32位确认号
    unsigned char th_lenres; //4位首部长度/6位保留字
    unsigned char th_flag; //6位标志位
    USHORT th_win; //16位窗口大小
    USHORT th_sum; //16位校验和
    USHORT th_urp; //16位紧急数据偏移量
    }TCPHEADER;

    //CheckSum:计算校验和的子函数
    USHORT checksum(USHORT *buffer, int size)
    {
    unsigned long cksum=0;
    while(size >1)
    {
    cksum+=*buffer++;
    size -=sizeof(USHORT);
    }
    if(size )
    {
    cksum += *(UCHAR*)buffer;
    }

    cksum = (cksum >> 16) + (cksum & 0xffff);
    cksum += (cksum >>16);
    return (USHORT)(~cksum);
    }

    void useage()
    {
    printf("****************************************** ");
    printf("TCPPing ");
    printf(" Written by Refdom ");
    printf(" Email: [email protected] ");
    printf("Useage: TCPPing.exe Target_ip Target_port ");
    printf("******************************************* ");
    }

    int main(int argc, char* argv[])
    {
    WSADATA WSAData;
    SOCKET sock;
    SOCKADDR_IN addr_in;
    IPHEADER ipHeader;
    TCPHEADER tcpHeader;
    PSDHEADER psdHeader;

    char szSendBuf[60]={0};
    BOOL flag;
    int rect,nTimeOver;

    useage();

    if (argc!= 3)
    { return false; }

    if (WSAStartup(MAKEWORD(2,2), &WSAData)!=0)
    {
    printf("WSAStartup Error! ");
    return false;
    }

    if ((sock=WSASocket(AF_INET,SOCK_RAW,IPPROTO_RAW,NULL,0,WSA_FLAG_OVERLAPPED))==INVALID_SOCKET)
    {
    printf("Socket Setup Error! ");
    return false;
    }
    flag=true;
    if (setsockopt(sock,IPPROTO_IP, IP_HDRINCL,(char *)&flag,sizeof(flag))==SOCKET_ERROR)
    {
    printf("setsockopt IP_HDRINCL error! ");
    return false;
    }

    nTimeOver=1000;
    if (setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (char*)&nTimeOver, sizeof(nTimeOver))==SOCKET_ERROR)
    {
    printf("setsockopt SO_SNDTIMEO error! ");
    return false;
    }
    addr_in.sin_family=AF_INET;
    addr_in.sin_port=htons(atoi(argv[2]));
    addr_in.sin_addr.S_un.S_addr=inet_addr(argv[1]);

    //
    //
    //填充IP首部
    ipHeader.h_verlen=(4<<4 | sizeof(ipHeader)/sizeof(unsigned long));
    // ipHeader.tos=0;
    ipHeader.total_len=htons(sizeof(ipHeader)+sizeof(tcpHeader));
    ipHeader.ident=1;
    ipHeader.frag_and_flags=0;
    ipHeader.ttl=128;
    ipHeader.proto=IPPROTO_TCP;
    ipHeader.checksum=0;
    ipHeader.sourceIP=inet_addr("本地地址");
    ipHeader.destIP=inet_addr(argv[1]);

    //填充TCP首部
    tcpHeader.th_dport=htons(atoi(argv[2]));
    tcpHeader.th_sport=htons(SOURCE_PORT); //源端口号
    tcpHeader.th_seq=htonl(0x12345678);
    tcpHeader.th_ack=0;
    tcpHeader.th_lenres=(sizeof(tcpHeader)/4<<4|0);
    tcpHeader.th_flag=2; //修改这里来实现不同的标志位探测,2是SYN,1是FIN,16是ACK探测 等等
    tcpHeader.th_win=htons(512);
    tcpHeader.th_urp=0;
    tcpHeader.th_sum=0;

    psdHeader.saddr=ipHeader.sourceIP;
    psdHeader.daddr=ipHeader.destIP;
    psdHeader.mbz=0;
    psdHeader.ptcl=IPPROTO_TCP;
    psdHeader.tcpl=htons(sizeof(tcpHeader));

    //计算校验和
    memcpy(szSendBuf, &psdHeader, sizeof(psdHeader));
    memcpy(szSendBuf+sizeof(psdHeader), &tcpHeader, sizeof(tcpHeader));
    tcpHeader.th_sum=checksum((USHORT *)szSendBuf,sizeof(psdHeader)+sizeof(tcpHeader));

    memcpy(szSendBuf, &ipHeader, sizeof(ipHeader));
    memcpy(szSendBuf+sizeof(ipHeader), &tcpHeader, sizeof(tcpHeader));
    memset(szSendBuf+sizeof(ipHeader)+sizeof(tcpHeader), 0, 4);
    ipHeader.checksum=checksum((USHORT *)szSendBuf, sizeof(ipHeader)+sizeof(tcpHeader));

    memcpy(szSendBuf, &ipHeader, sizeof(ipHeader));

    rect=sendto(sock, szSendBuf, sizeof(ipHeader)+sizeof(tcpHeader),
    0, (struct sockaddr*)&addr_in, sizeof(addr_in));
    if (rect==SOCKET_ERROR)
    {
    printf("send error!:%d ",WSAGetLastError());
    return false;
    }
    else
    printf("send ok! ");

    closesocket(sock);
    WSACleanup();

    return 0;
    }

    4、接收数据
    和发送原始套接字数据相比,接收就比较麻烦了。因为在WIN我们不能用recv()来接收raw socket上的数据,这是因为,所有的IP包都是先递交给系统核心,然后再传输到用户程序,当发送一个raws socket包的时候(比如syn),核心并不知道,也没有这个数据被发送或者连接建立的记录,因此,当远端主机回应的时候,系统核心就把这些包都全部丢掉,从而到不了应用程序上。所以,就不能简单地使用接收函数来接收这些数据报。

    要达到接收数据的目的,就必须采用嗅探,接收所有通过的数据包,然后进行筛选,留下符合我们需要的。可以再定义一个原始套接字,用来完成接收数据的任务,需要设置SIO_RCVALL,表示接收所有的数据。

    SOCKET sniffersock;
    sniffsock = WSASocket(AF_INET, SOCK_RAW, IPPROTO_IP, NULL, 0, WSA_FLAG_OVERLAPPED);

    DWORD lpvBuffer = 1;
    DWORD lpcbBytesReturned = 0 ;
    WSAIoctl(sniffersock, SIO_RCVALL, &lpvBuffer, sizeof(lpvBuffer), NULL, 0, & lpcbBytesReturned, NULL, NULL);

    创建一个用于接收数据的原始套接字,我们可以用接收函数来接收数据包了。然后在使用一个过滤函数达到筛选的目的,接收我们需要的数据包。

    如果在XP以上的操作系统,微软封杀了Raw Soccket,只能用wincpap之类的开发包了。

❺ 用C语言实现把一个数组写入到另一个数组中,重复的过滤掉。

不可以a【10】指的是a数组的第11个元素,同样b也一样,你这样写只能够把b的第11个元素值赋给a的第十一个元素
求采纳为满意回答。

❻ C语言如何实现满足多条件匹配简单过滤问题

||

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#defineMAX11
#defineMIN1
#defineNUM6
intdata[NUM];
intcheck(void)
{
inti;
intj;
intret;

ret=0;
for(i=j=0;i<NUM;i++)
{
if(data[i]==1||[i]==2||data[i]==3)
{
j++;
}
}
if(!(j==1||j==2))
{
returnret;
}
for(i=j=0;i<NUM;i++)
{
if(data[i]==2||data[i]==6||data[i]==8||data[i]==9)
{
j++;
}
}
if(!(j>=1&&j<=3))
{
returnret;
}
for(i=j=0;i<NUM;i++)
{
if(data[i]==1||(data[i]>=6&&data[i]<=11))
{
j++;
}
}
if(!(j>=0&&j<=2))
{
returnret;
}

ret=1;

returnret;
}
voiddisplay(void)
{
inti;

for(i=0;i<NUM;i++)
{
printf("%d",data[i]);
}
printf(" ");
}
intfuckagain(intlol)
{
if(data[lol]==lol+MAX-NUM+1)
{
returnfuckagain(lol-1);
}
else
{
data[lol]++;
returnlol;
}
}
voidfuck(void)
{
inti;

i=fuckagain(NUM-1);

if(i==NUM-1)
{
return;
}
if(data[i]<MAX-NUM+1+i)
{
for(;i<NUM-1;i++)
data[i+1]=data[i]+1;
}

}
intmain(void)
{
inti,j;

j=0;
for(i=0;i<NUM;i++)
{
data[i]=i+MIN;
}

if(check())
{
display();
j++;
}
for(i=1;data[0]<MAX-NUM+1;i++)
{
fuck();
if(check())
{
display();
j++;
}
}
printf("tatal=%d,matchcondition=%d ",i,j);
}

❼ C语言怎么编写:请编写一个字符串过滤程序,若字符串中出现多个相同的字符,将非首次出现的字符过滤掉。

结果出来了源,你看看吧,满意请采纳

#include<stdio.h>
#include<string.h>
voidfinddd(charx[]);

intmain()
{
chara[150];
char*aa;
inta1;
inti;

printf("请输入任意的字符串:");
gets(a);
finddd(a);
return0;
}

voidfinddd(charx[])//不带数据返回
{
inti,shu=0;
charaa[100];
intaaa[200]={0};

for(i=0;i<strlen(x);i++)
{
if(aaa[x[i]]==0)
{
aaa[x[i]]=1;
aa[shu++]=x[i];
}
}
aa[shu++]='';

printf("剔除重复字符后的字符串:%s ",aa);
}

❽ c语言如何过滤去非16进制的字符

||#include<stdio.h>
void main()
{
char str[100];
int t,i=0;
printf("请输入一个字符串\n");
gets(str);
for(t=0;str[t]!版='\0';t++)
if(('A'<=str[t]&&str[t]<='F')||权('a'<=str[t]&&str[t]<='f')||('0'<=str[t]&&str[t]<='9'))
str[i++]=str[t];
str[i]=0;
printf("%s\n",str);
}

❾ c语言里怎么滤掉前导空白字符,原理是什么

就是把输入字符中的非数字内容过滤掉,原理用的是ASCALL(好像是这样拼的)编码,数字的编码为0~9,检测为非数字就叫你重新输入

❿ C语言从键盘输入一个含有英文字母,英文符号,数字的字符串,如何过滤其中的字母

#include <stdio.h>

#include <string.h>

int main()

{

char str[111];

int k=0;

gets(str);

for(int i=0;i<strlen(str);i++)

if(!(str[i]>='a'&&str[i]<='z'||str[i]>='A'&&str[i]<='Z'))

str[k++]=str[i];//非字母字符保留,字母字符删除;

str[k]='';//新字符串加个结束符

puts(str);

return 0;

}

阅读全文

与C语言数据包过滤相关的资料

热点内容
深度过滤器厂家 浏览:381
米家空气净化器2怎么拆开 浏览:917
工业润滑油过滤市场 浏览:495
医院污水池除臭排放标准 浏览:166
阴离子阳离子交换膜 浏览:123
戴森空气净化器滤芯怎么拆 浏览:928
净化器上面显示复位什么意思 浏览:999
净水器里有什么水可以做雾化 浏览:396
蒸馏石油的分馏 浏览:744
饮水机水桶为什么会变绿 浏览:803
饮水机热水往上出是什么意思 浏览:627
如何当好污水处理厂的班长 浏览:327
微动力污水处理器 浏览:729
四氯化碳如何蒸馏水 浏览:950
废水资源化问题与出路 浏览:705
树脂补牙还要打磨 浏览:189
什么叫做雨污水阴阳管 浏览:438
废水处理ph是什么意思 浏览:17
反渗透净水器有废水比是什么意思 浏览:507
净化器过滤芯怎么取出 浏览:837