Пример #1
0
int main(int argc, char **argv){

    char* interface = argv[1];
    unsigned char *packet_header;

    struct sockaddr sa;
    int sock, ethhdr_len;
    uint16_t len ;
    unsigned char buffer[100] ;
    struct frame header ;
    FILE *fp;
    struct ifreq ethreq;
    long int counter = 0;

    if(argc != 6){
        printf("Wrong number of arguments\n") ;
	printf("Usage:\n\t./node interface <input file> <own mac> <router mac> <output file>\n\n") ;
	exit(0) ;
    }

    outFile = argv[5] ;

    sock = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
    if (sock == -1) { 
        printf("when opening socket in PAListener");
    }

    fp = fopen(argv[2], "rb") ;
    if(fp == NULL)
        printf("No such file exists\n") ;

    header.type = 0x4e ;

    BindRawSocketToInterface(argv[1], sock, ETH_P_ALL);
    CreateEthernetHeader(&header, argv[3], argv[4], ETH_P_ALL);
    ethhdr_len = sizeof(struct sniff_ethernet);
    pthread_t interfaceSniffer;
    int res ;
    res = pthread_create(&interfaceSniffer, NULL, sniffer, (void *)sock); 
    if( res != 0){
	fprintf(stderr, "TCP read thread creation failed\n") ;
	exit(EXIT_FAILURE) ;
    }

    printf("hello\n") ;
    int wait ;
    scanf("Enter when ready %d", &wait) ;

    while(!feof(fp)){
	if (fscanf(fp, "%s" , header.buf) == EOF) 
	    break ;
	printf("Sent %s\n", header.buf) ;

        if(write(sock,&header,ethhdr_len+FRAME_LEN) < 0){
            perror("sendto");
        }
        usleep(100) ;
    }
    pthread_join(interfaceSniffer, NULL) ;
}
/* argv[1] is the device e.g. eth0
   argv[2] is the number of packets to send
*/ 
int main(int argc, char **argv){
	if (argc < 1){
		perror("Arguments?\n");
		return 1;
	}

	int raw;
	unsigned char* packet;
	struct ethhdr *ethernet_header;
	struct iphdr *ip_header;
	struct tcphdr  *tcp_header;
	unsigned char *data;	
	int num_of_pkts;
	int pkt_len;
	
	/* Create the raw socket */
	raw = CreateRawSocket(ETH_P_ALL);

	/* Bind raw socket to interface */
	BindRawSocketToInterface(argv[1], raw, ETH_P_ALL);
	//num_of_pkts = atoi(argv[2]);

	ethernet_header = CreateEthernetHeader();
	ip_header = CreateIPHeader();
	tcp_header = CreateTcpHeader();
	data = CreateData(DATA_SIZE);

	/* Create PseudoHeader and compute TCP Checksum  */
	CreatePseudoHeaderAndComputeTcpChecksum(tcp_header, ip_header, data);

	//pkt_len = sizeof(struct ethhdr) + sizeof(struct iphdr);
	pkt_len = sizeof(struct ethhdr) + ntohs(ip_header->tot_len);

	packet = (unsigned char *) malloc(pkt_len);
	memcpy(packet, ethernet_header, sizeof(struct ethhdr));
	memcpy((packet + sizeof(struct ethhdr)), ip_header, ip_header->ihl*4);
	memcpy((packet + sizeof(struct ethhdr) + ip_header->ihl*4),tcp_header, tcp_header->doff*4);
	memcpy((packet + sizeof(struct ethhdr) + ip_header->ihl*4 + tcp_header->doff*4), data, DATA_SIZE);

	//while((num_of_pkts--)>0){
		if(!SendRawPacket(raw, packet, pkt_len))
			perror("Error sending packet");
		else
			printf("Packet sent successfully\n");
	//}

	/*free(ethernet_header);
	free(ip_header);
	free(tcp_header);
	free(data);
	free(packet);*/

	close(raw);

	return 0;
}