⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 msg-nicdsp.c

📁 从网卡读数据
💻 C
字号:
#include <stdio.h>#include <stdlib.h>#include <linux/ip.h>#include <linux/tcp.h>#include <linux/if_ether.h>#include <sys/time.h>#include <sys/socket.h>#include <sys/types.h>#include <sys/ioctl.h>#include <netinet/in.h>#include <netdb.h>#include <arpa/inet.h>#include <signal.h>#include <string.h>#include <linux/if.h>#include <linux/socket.h>#include <linux/if_packet.h>#include <fcntl.h>#include <sys/msg.h>#define JDEBUG#include "jdebug.h"#include "msghdr.h"int openintf(char *);//void cleanup(int);int state=0;struct etherpacket{    struct ethhdr   eth;    struct iphdr    ip;    struct tcphdr   tcp;    char	    buff[1600];		/*changed from 8192 by jack on Jul 18,2008*/}ep,ep_eth0, ep_eth1;struct iphdr	*ip, *ip_eth0;struct tcphdr	*tcp, *tcp_eth0;int		s;FILE		*fp;#define	TCPLOG	    "tcp.log"#define INTERFACE   "eth1" int openintf(char *d){    int fd;    struct ifreq ifr;    int ss;	struct packet_mreq mr;	struct sockaddr_ll src;//    fd = socket(AF_INET, SOCK_PACKET, htons(0x800));	fd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_IP));  	if (fd < 0)    {	perror("cant get SOCK_PACKET socket");	exit(0);    }	memset(&ifr, 0, sizeof(ifr));    strcpy(ifr.ifr_name,d);    ss = ioctl(fd, SIOCGIFINDEX, &ifr);    if (ss < 0)    {		close(fd);		perror("cant get index");		exit(0);    }		memset(&src, 0, sizeof(src));	src.sll_family		= AF_PACKET;	src.sll_protocol	= htons(ETH_P_ALL);	src.sll_ifindex		= ifr.ifr_ifindex;	ss = bind(fd, (struct sockaddr*)&src, sizeof(src));	if (ss < 0)	{		close(fd);		perror("cant bind eth1");		exit(0);	}/*	Method 1: use setsockopt to set promiscuous mode */	memset(&mr, 0, sizeof(mr));	mr.mr_ifindex = ifr.ifr_ifindex;	mr.mr_type = PACKET_MR_PROMISC;                       //bt	ss = setsockopt(fd, SOL_PACKET, PACKET_ADD_MEMBERSHIP, &mr, sizeof(mr));/*  Method 2: use ioctl to set promiscuous mode *///    ifr.ifr_flags |= IFF_PROMISC;//    ss = ioctl(fd, SIOCSIFFLAGS, &ifr);    if (ss < 0)	{		perror("cant set promiscuous mode");    	exit(1);	}	return fd;}// on May 8th// remove read_tcp(), filter(),print_header, print_data// print_iphdr(), print_tcphdr()void i2a(char *data, char *str){	if (data == NULL || str == NULL)	{		printf("error pointer\n");		exit(1);	}	sprintf(str,"%d.%d.%d.%d", data[0], data[1], data[2], data[3]);		return;}int openfifo(char *file,mode_t mode){    int retv;    retv = open(file, mode);    if (retv < 0)    {        printf("cant open fifo:%s\n",file);        exit(0);    }    return retv;}int openqueue(key_t key){	int retv;	retv = msgget(key,IPC_CREAT|IPC_EXCL);	if (retv < 0)	{		printf("can not open msg queue(key%d)\n",key);		exit(0);	}	return retv;}	main(int argc, char *argv[]){	int frame_index,read_len;	int fdin,fdout;	msg_t omsg, imsg;	int result, iplength;	int eth0_read_len, snd_msg_len;	int tmp, retv;    s = openintf("eth1");    ip = (struct iphdr *)(((unsigned long)&ep.ip) - 2);    tcp = (struct tcphdr *)(((unsigned long)&ep.tcp) - 2);    ip_eth0 = (struct iphdr *)(((unsigned long)&ep_eth0.ip) - 2);    tcp_eth0 = (struct tcphdr *)(((unsigned long)&ep_eth0.tcp) - 2);	fp = stdout;		fdout = openqueue(NICIKEY);	fdin  = openqueue(NICOKEY);/*	sockwrt = openfifo(DSPFILE,);	if (sockwrt < 0)	{		fprintf(stderr,"cant open dsp file:%s\n",DSPFILE);		exit(0);	}*/		if (fork() == 0)	{		printf("get ready!\n");		while (1) 		{						printf("--------get ready to read eth1------\n");			//state=1;			read_len = read(s, &ep_eth0, sizeof(ep));			//state=0;			printf("---read eth1 return: %d\n",read_len);			memset(&omsg, 0 , sizeof(omsg));			omsg.type = 0x1111;			memcpy(omsg.data+5,&ep_eth0,read_len);	/*reserved some buff */			snd_msg_len = LONGSIZE + 5 + read_len;			//usleep(100000);                          //by bt			tmp = msgsnd(fdout,&omsg,snd_msg_len,IPC_NOWAIT);			if (!tmp)			Jdebug("---write NIC IN queue %d.\n",snd_msg_len);			else			Jdebug("####write NIC In queue wrong.\n");		}	}	else {	while(1)	{		eth0_read_len = msgrcv(fdin,&imsg,sizeof(imsg),0,0);				printf("read Nic OUT return:%d\n",eth0_read_len);		eth0_read_len = eth0_read_len - LONGSIZE - 5;		memset(&ep_eth1, 0, sizeof(ep_eth1));		memcpy(&ep_eth1, imsg.data+5, eth0_read_len);//		retv = write(s,imsg.data+5,eth0_read_len);			retv = write(s,&ep_eth1, eth0_read_len-4);		Jdebug("write eth1 return:%d\n", retv);	}	}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -