原始套接字编程 linux,linux下面的原始套接字编程问题

这个可以用抓包实现的么

老早以前的了,希望对你有帮助

/*author  :Logic0

time    :2009-1-7

OS      :UBUNTU 9.04

compiler:GCC 4.3.3

compile :gcc -o sniffer sniffer.c -lpcap

run     :as root

*/

#include

#include

#include                            /*use libpcap lib*/

#include

#include

#include

#include

#include

#include

#include

#define MAX_LEN_2_SNAP 2048                 /*maxlen of packets to grab*/

/*

*define arp flags

*/

#define ARP_REQUEST 1

#define ARP_REPLY 2

/*

*define libpcap error code

*/

#define ERROR_RET -1

#define ERROR_GET NULL

#define PROMISC_MODE 1

#define WAIT_TIME 0

typedef struct my_arphdr

{

u_int16_tar_hrd;/* format of hardware address*/

u_int16_t    ar_pro;/* format of protocol address*/

unsigned charar_hln;/* length of hardware address*/

unsigned charar_pln;/* length of protocol address*/

u_int16_tar_op;/* ARP opcode (command)*/

unsigned charar_sha[6];    /* sender hardware address*/

unsigned charar_sip[4];/* sender IP address*/

unsigned charar_tha[6];    /* target hardware address*/

unsigned charar_tip[4];/* target IP address*/

}ARPHDR_T;

struct bpf_program filter;             /*packet filter*/

struct pcap_pkthdr pkthdr;             /*libpcap header*/

struct in_addr addr;

bpf_u_int32 netp,maskp;

struct ethhdr *my_ethhdr;                  /*ethernet packet header*/

struct tcphdr *my_tcphdr;                  /*tcp packet header*/

struct iphdr  *my_iphdr;                   /*ip packet header*/

ARPHDR_T      *my_arphdr;                  /*arp packet header*/

void construct_filter(struct bpf_program *filter);

int get_dtl(pcap_t * , char *);

int get_ip_packets(pcap_t * , char *);

int get_tcp_packets(pcap_t * , char *);

int get_arp_packets(pcap_t * , char *);

void get_cnt(int *p);                       /*user input the number of packets to grab*/

int main()

{

int ret = 0;                           /*return value for error check*/

pcap_t *descr;

char *device,errbuf[PCAP_ERRBUF_SIZE]; /*network device  and  error buf*/

int choice = 0;

/*

*       menu

*/

fprintf(stdout,"0.Type of my datalinkn");

fprintf(stdout,"1.Grab and analyse all packetn");

fprintf(stdout,"2.Grab and analyse IP packetn");

fprintf(stdout,"3.Grab and analyse TCP packetn");

fprintf(stdout,"4.Grab and analyse ARP packetn");

fprintf(stdout,"YOUR CHOICE:");

scanf("%d",&choice);

/*

*    get device

*/

device = pcap_lookupdev(errbuf);

if(device == ERROR_GET)

{

fprintf(stdout,"device get error:%sn",errbuf);

exit(1);

}

fprintf(stdout,"DEVICE :%sn",device);

/*

*get and print net and netmask

*/

ret = pcap_lookupnet(device , &netp , &maskp , errbuf);

if(ret == ERROR_RET)

{

fprintf(stdout,"NET find error:%sn",errbuf);

exit(1);

}

addr.s_addr = netp;

fprintf(stdout,"NET    :%sn",inet_ntoa(addr));

addr.s_addr = maskp;

fprintf(stdout,"NETMASK:%sn",inet_ntoa(addr));

/*

*open the device

*/

descr = pcap_open_live(device , MAX_LEN_2_SNAP , PROMISC_MODE , WAIT_TIME , errbuf);

if(descr == ERROR_GET)

{

fprintf(stdout,"open device link error:%sn",errbuf);

exit(1);

}

/*

*process user's choice

*/

while(1)

{

switch(choice)

{

case 0:

get_dtl(descr,errbuf);

break;

case 1:

get_all_packets(descr,errbuf);

break;

case 2:

get_ip_packets(descr,errbuf);

break;

case 3:

get_tcp_packets(descr,errbuf);

break;

case 4:

get_arp_packets(descr,errbuf);

break;

default:

fprintf(stdout,"input error!reinput:n");

}

fprintf(stdout,"Your choice:");

scanf("%d",&choice);

}

return 0;

}

void get_cnt(int *cnt_p)

{

fprintf(stdout,"input how many packets to grab:");

scanf("%d",cnt_p);

return;

}

int get_dtl(pcap_t *descr , char *err)

{

int ret;

ret = pcap_datalink(descr);

/*

* DLT_EN10MB ------> ETHERNET 10/100/1000MB

* DLT_PPP_ENTHER---> PPPOE

*/

if(ret == DLT_EN10MB)

{

fprintf(stdout,"DATALINK TYPE :Ethernet 10/100/1000MBn");

return 1;

}

if(ret == DLT_PPP_ETHER)

{

fprintf(stdout,"DATALINK TYPE :PPPOEn");

return 1;

}

fprintf(stdout,"DATALINK TYPE :OTHERn");

return 0;

}

int get_ip_packets(pcap_t *descr , char *err)

{

char *packet;

int cnt = 0;

get_cnt(&cnt);

fprintf(stdout,"protocoltlengthtsrc_ipttdst_ipn");

while(cnt--)

{

packet = pcap_next(descr , &pkthdr);

my_iphdr = (struct iphdr *)(packet + sizeof(struct ethhdr));

addr.s_addr = my_iphdr->saddr;

fprintf(stdout,"IPtt%dt%st",ntohs(my_iphdr->tot_len) ,inet_ntoa(addr));

addr.s_addr = my_iphdr->daddr;

fprintf(stdout,"%sn",inet_ntoa(addr));

}

return 0;

}

int get_tcp_packets(pcap_t *descr , char *err)

{

char *packet;

int cnt = 0 ;

get_cnt(&cnt);

fprintf(stdout,"protocoltwindowtSEQtack_seqn");

while(cnt--)

{

packet = pcap_next(descr , &pkthdr);

my_tcphdr = (struct tcphdr *)(packet + sizeof(struct ethhdr)+sizeof(struct iphdr));

fprintf(stdout,"TCPtt%dt%dt%dn",ntohs(my_tcphdr->window) ,ntohs( my_tcphdr->seq) ,ntohs( my_tcphdr->ack_seq));

}

return 0;

}

int get_arp_packets(pcap_t *descr , char *err)

{

char *packet;

int cnt = 0;

int i = 0;                 /*for temp use*/

get_cnt(&cnt);

fprintf(stdout,"protocoltkindtsender_macttarget_macn");

pcap_compile(descr , &filter , "arp" , 1 , maskp);

pcap_setfilter(descr , &filter);

while(cnt--)

{

packet = pcap_next(descr , &pkthdr);

my_arphdr = (struct arphdr *)(packet + 14);

fprintf(stdout,"ARPtt%st",ntohs(my_arphdr->ar_op)==ARP_REQUEST?"Request":"Reply");

for(i = 0 ; i ar_sha[i]));

}

fprintf(stdout,"t");

for(i = 0 ; i ar_tha[i]));

}

fprintf(stdout,"n");

}

pcap_compile(descr , &filter , "", 1 , maskp);

pcap_setfilter(descr , &filter);

return 0;

}

int get_all_packets(pcap_t *descr , char *err)

{

char *packet;

int cnt = 0;

struct ether_header *my_eth;

get_cnt(&cnt);

fprintf(stdout,"protocoltlengthtsrc_ipttdst_ipn");

while(cnt--)

{

packet = pcap_next(descr , &pkthdr);

my_eth = (struct ethhdr *)packet;

switch(ntohs(my_eth->ether_type))

{

case ETHERTYPE_IP:

fprintf(stdout,"IPV4tt");

break;

case ETHERTYPE_ARP:

fprintf(stdout,"ARPtt");

break;

case ETHERTYPE_REVARP:

fprintf(stdout,"RARPtt");

break;

case ETHERTYPE_IPV6:

fprintf(stdout,"IPV6tt");

break;

default:

fprintf(stdout,"OTHERtt");

}

fprintf(stdout,"%dt",pkthdr.len);

my_iphdr = (struct iphdr *)(packet + sizeof(struct ethhdr));

addr.s_addr = my_iphdr->saddr;

fprintf(stdout,"%st",inet_ntoa(addr));

addr.s_addr = my_iphdr->daddr;

fprintf(stdout,"%sn",inet_ntoa(addr));

}

return 0;

}

博客地址:https://blog.csdn.net/weixin_41749063/article/details/104023987 摘要: ## 1.简介 其实Qt网络模块中自带的[QTcpsocket](https://doc.qt.io/archives/qt-5.6/qtcpsocket.html)已经封装的很好了,避免了用原始套接字编程繁琐的过程,不过大部分应用场景我们希望将收发数据 运行在一个单独的线程,不阻塞界面或其他线程。所以结合Qt自带的QThread类 简单的封装了一下QTcpsocket,使其工作 在单独线程,并加入了心跳和断线重连机制。 ## 2.EasyClient类说明 由于接触QT时间不是很长,所以写的不是很好,可能里边也有Bug,不过觉得这个思路应该是可行的。封装的比较简单,若有问题完全可以自己改改。主要提供一个思路就是的将一个继承自QObject的子类转移到一个线程,使其在这个线程里进行事件循环,开一个定时器用于发送心跳和重连。 经过采坑发现,定时器的开和关需放在实例化EasyClient子类的那个线程(下面称之为主线程),不能在事件循环线程中(下面称之为子线程中)否则会有错。实例化QTcpsock需要在 子线程中进行,否则会出现无法正常通信的现象。 使用时只需要实例化一个EasyClient的子类,重写SendHeartBeat()和DisPoseReceiveData()两个纯虚函数,SendHeartBeat()决定发什么内容作为心跳指令,当有数据可读时会全部读入,只需要在DisPoseReceiveData()做处理即可。.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值