Код:
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <time.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <string.h>
#include <fcntl.h>
#include <pthread.h>
#include <signal.h>
typedef struct IPHeader {
unsigned char iph_verlen;
unsigned char iph_tos;
unsigned short iph_length;
unsigned short iph_id;
unsigned short iph_offset;
unsigned char iph_ttl;
unsigned char iph_protocol;
unsigned short iph_xsum;
unsigned long iph_src;
unsigned long iph_dest;
}IPHeader;
int read_sock(char *buf,int sock)
{
int n=0;
if(buf!=NULL){
n=recv(sock,buf,100,0);
};
return n;
};
int ac;
char **av;
void *pthr1(void *);
static char lhost[16];
static char buff[65536];
struct hostent *ht;
struct sockaddr_in sa;
int ss=0;
int main(int argc,char *argv[])
{
ac=argc;
av=argv;
if(argc<2)
{
printf("May be 2 arguments in command line\n");
exit(0);
};
gethostname(lhost,sizeof(lhost));
ht=gethostbyname(lhost);
sa.sin_family=AF_INET;
sa.sin_addr.s_addr= ((struct in_addr*)ht->h_addr_list[0])->s_addr;
ss=socket(AF_INET,SOCK_RAW,IPPROTO_IP);
if(ss==-1){
perror("socket");
exit(0);
};
bind(ss,(struct sockaddr*)&sa,sizeof(sa));
bool flg=true;
//ioctl(ss,SIO_RCVALL,&flg);--специально закоментировал в Windows позволяет принимать все пакеты проходящие через сетевой интерфейс, а как зделать чтоб принимало все пакеты в Linux?
pthread_attr_t pa1;
pthread_t pt1;
pthread_attr_init(&pa1);
int pr=pthread_create(&pt1,&pa1,pthr1,NULL);
if(pr==0)
{
printf("Snifer thread 1\n");
} else
{
perror("thread 1");
exit(1);
};
return 0;
};
void *pthr1(void *)
{
for(;;)
{
int i=0;
if (recv(ss, buff, sizeof(buff), 0) >= sizeof(IPHeader)) {
IPHeader* hdr = (IPHeader*)buff;
long size=(hdr->iph_length << 8) + (hdr->iph_length >> 8);
if(strcmp(av[1],"TCP"))
{
int fd=open("snif.txt",O_RDWR | O_CREAT);
if(fd==-1){
perror("open");
exit(0);
} else {
write(fd, "--Packet begin--\r\n", 18);
struct in_addr ia;
ia.s_addr=hdr->iph_dest;
char *ptarip=inet_ntoa(ia);
write(fd, "To: ", 4);
write(fd, ptarip,strlen(ptarip));
write(fd, "\r\n", 2);
static char ssize[16];
sprintf(ssize,"%d",size);
write(fd,"Packet length: ",15);
write(fd,ssize,strlen(ssize));
};
};
};
};
};