void receive_file(struct packet* hp, struct packet* data, int sfd, FILE* f)
{
	int x;
	int i = 0, j = 0;
	if((x = recv(sfd, data, size_packet, 0)) <= 0)
		er("recv()", x);
	j++;
	hp = ntohp(data);
	printpacket(hp, HP);
	// 当在数据传输的时候 type字段会用来标示是否
	while(hp->type == DATA)
	{
		// 将收到的数据写入文件,二进制写入方式
		i += fwrite(hp->buffer, 1, hp->datalen, f);
		if((x = recv(sfd, data, size_packet, 0)) <= 0)
			er("recv()", x);
		j++;
		hp = ntohp(data);
		printpacket(hp, HP);
	}
	fprintf(stderr, "\t%d data packet(s) received.\n", --j);	// j decremented because the last packet is EOT.
	fprintf(stderr, "\t%d byte(s) written.\n", i);
	if(hp->type == EOT)
		return;
	else
	{
		fprintf(stderr, "Error occured while downloading remote file.\n");
		exit(2);
	}
	fflush(stderr);
}
Example #2
0
static void recvpacket(int sock, int recvmsg_flags,
		       int siocgstamp, int siocgstampns)
{
	char data[256];
	struct msghdr msg;
	struct iovec entry;
	struct sockaddr_in from_addr;
	struct {
		struct cmsghdr cm;
		char control[512];
	} control;
	int res;

	memset(&msg, 0, sizeof(msg));
	msg.msg_iov = &entry;
	msg.msg_iovlen = 1;
	entry.iov_base = data;
	entry.iov_len = sizeof(data);
	msg.msg_name = (caddr_t)&from_addr;
	msg.msg_namelen = sizeof(from_addr);
	msg.msg_control = &control;
	msg.msg_controllen = sizeof(control);

	res = recvmsg(sock, &msg, recvmsg_flags|MSG_DONTWAIT);
	if (res < 0) {
		printf("%s %s: %s\n",
		       "recvmsg",
		       (recvmsg_flags & MSG_ERRQUEUE) ? "error" : "regular",
		       strerror(errno));
	} else {
		printpacket(&msg, res, data,
			    sock, recvmsg_flags,
			    siocgstamp, siocgstampns);
	}
}
Example #3
0
void checkpackets() // check for and process packets
{

	PacketReceivePacket(lpAdapter,lpPacket,TRUE);	


	char *data;
	data = (char *)lpPacket->Buffer;
	int tbytes;
	tbytes = lpPacket->ulBytesReceived;
	int reader = 0;
	while(reader < tbytes)
	{
		bpf_hdr *header;
		header=(struct bpf_hdr *)(data+reader);
		int datalength = header->bh_datalen;
		int totallength = header->bh_caplen;
		reader = reader + header->bh_hdrlen;
		char *readme;
		readme = data+reader;
		printpacket((unsigned char *)readme, datalength);
		reader = Packet_WORDALIGN(reader+datalength);
	}



}
Example #4
0
int main(int argc, char *argv[])
{
    //memcpy(self_client_id, "qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq", 32);
    
    if (argc < 4) {
        printf("usage %s ip port client_id(of friend to find ip_port of)\n", argv[0]);
        exit(0);
    }
    DHT_addfriend((uint8_t *)argv[3]);
    
    //initialize networking
    //bind to ip 0.0.0.0:PORT
    IP ip;
    ip.i = 0;
    init_networking(ip, PORT);
    
    int randdomnum = random_int();
    memcpy(self_client_id, &randdomnum, 4);
    

    perror("Initialization");
    IP_Port bootstrap_ip_port;
    bootstrap_ip_port.port = htons(atoi(argv[2]));
    //bootstrap_ip_port.ip.c[0] = 127;
    //bootstrap_ip_port.ip.c[1] = 0;
    //bootstrap_ip_port.ip.c[2] = 0;
    //bootstrap_ip_port.ip.c[3] = 1;
    bootstrap_ip_port.ip.i = inet_addr(argv[1]);
    DHT_bootstrap(bootstrap_ip_port);
    
    IP_Port ip_port;
    uint8_t data[MAX_UDP_PACKET_SIZE];
    uint32_t length;
    
    while(1)
    {
            
        doDHT();
        
        while(receivepacket(&ip_port, data, &length) != -1)
        {
            if(DHT_handlepacket(data, length, ip_port))
            {
                //unhandled packet
                printpacket(data, length, ip_port);
            }
            else
            {
                printf("Received handled packet with length: %u\n", length);
            }
        }
        print_clientlist();
        print_friendlist();
        c_sleep(300);
    }
    
    shutdown_networking();
    return 0;   
}
/* recieve packets and send them to the packethandler
 * run doLossless_UDP(); */
void Lossless_UDP()
{
    IP_Port ip_port;
    uint8_t data[MAX_UDP_PACKET_SIZE];
    uint32_t length;
    while (receivepacket(&ip_port, data, &length) != -1) {
        //if(rand() % 3 != 1)//add packet loss
        //{
            if (LosslessUDP_handlepacket(data, length, ip_port)) {
                    printpacket(data, length, ip_port);
            } else {
                //printconnection(0);
                 printf("Received handled packet with length: %u\n", length);
            }
        //}
    }
    
    doLossless_UDP();   
}
// the operation of GET file command
void command_get(struct packet* shp, struct packet* data, int sfd_client, char* lpwd)
{
    int x;
    FILE* f = fopen(shp->buffer, "rb");
    shp->type = INFO;
    shp->comid = GET;
    strcpy(shp->buffer, f ? "OK: File found; processing..." : "ER: Error opening file.");
    printpacket(shp, HP);
    data = htonp(shp);
    if(( x = send(sfd_client, data, size_packet, 0)) != size_packet)
        er("send()", x);
    if(f)
    {
        shp->type = DATA;
        //send_file(shp, data, sfd_client, f);
        send_file(shp, data, sfd_server_data, f);
        fclose(f);
    }
    send_EOT(shp, data, sfd_server_data);
    //send_EOT(shp, data, sfd_client);
}
// the operation of PRT command
void command_prt(struct packet* shp, struct packet* data, int sfd_client, char* lpwd)
{
    if(DEBUG)
        printf("Starting prt...\n");
    int x;
    int dataportnum = atoi(shp->buffer);
    shp->type = INFO;
    shp->comid = PRT;
    strcpy(shp->buffer, dataportnum ? "OK: Port Gotten; processing..." : "ER: Error getting port num.");
 
    printpacket(shp, HP);

    data = htonp(shp);
    if(( x = send(sfd_client, data, size_packet, 0)) != size_packet)
        er("send()", x);

    if(DEBUG)
        printf("OK, waiting for connection\n");

    if(dataportnum)
    {
        struct sockaddr_in skin_server_data;
        int x;
        size_t size_sockaddr = sizeof(struct sockaddr), size_packet = sizeof(struct packet);

        if(( x = sfd_server_data = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
            er("socket()", x);

        memset((char*) & skin_server_data, 0, sizeof(struct sockaddr_in));
        skin_server_data.sin_family = AF_INET;
        skin_server_data.sin_addr.s_addr = inet_addr(IPCLIENT);
        skin_server_data.sin_port = htons(dataportnum);

        if(( x = connect(sfd_server_data, (struct sockaddr*) &skin_server_data, size_sockaddr)) < 0)
            er("connect()", x);
        printf(ID "Data channel build. Communicating with client @ %s:%d...\n\n", IPCLIENT, dataportnum);
    }
    send_EOT(shp, data, sfd_client);    
}
Example #8
0
int main(int argc, char *argv[])
{
    //memcpy(self_client_id, "qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq", 32);
    
    if (argc < 4) {
        printf("usage %s ip port public_key\n", argv[0]);
        exit(0);
    }
    new_keys();
    printf("OUR ID: ");
    uint32_t i;
    for(i = 0; i < 32; i++) {
        if(self_public_key[i] < 16)
            printf("0");
        printf("%hhX",self_public_key[i]);
    }
    
    char temp_id[128];
    printf("\nEnter the client_id of the friend you wish to add (32 bytes HEX format):\n");
    if(scanf("%s", temp_id) != 1)
        exit(0);
    
    DHT_addfriend(hex_string_to_bin(temp_id));
    
    /* initialize networking */
    /* bind to ip 0.0.0.0:PORT */
    IP ip;
    ip.i = 0;
    init_networking(ip, PORT);
    

    perror("Initialization");
    IP_Port bootstrap_ip_port;
    bootstrap_ip_port.port = htons(atoi(argv[2]));
    /* bootstrap_ip_port.ip.c[0] = 127;
     * bootstrap_ip_port.ip.c[1] = 0;
     * bootstrap_ip_port.ip.c[2] = 0;
     * bootstrap_ip_port.ip.c[3] = 1; */
    bootstrap_ip_port.ip.i = inet_addr(argv[1]);
    DHT_bootstrap(bootstrap_ip_port, hex_string_to_bin(argv[3]));
    
    IP_Port ip_port;
    uint8_t data[MAX_UDP_PACKET_SIZE];
    uint32_t length;
    
    while(1) {
            
        doDHT();
        
        while(receivepacket(&ip_port, data, &length) != -1) {
            if(DHT_handlepacket(data, length, ip_port) && friendreq_handlepacket(data, length, ip_port)) {
                //unhandled packet
                printpacket(data, length, ip_port);
            } else {
                printf("Received handled packet with length: %u\n", length);
            }
        }
        print_clientlist();
        print_friendlist();
        c_sleep(300);
    }
    
    shutdown_networking();
    return 0;   
}
Example #9
0
int main (int argc, char **argv) {

  unsigned int daddr = inet_addr(argv[1]); // transforma o segundo parametro no formato de endereço de IP

  int sockfd = socket(AF_INET, SOCK_RAW, 48); //Cria file descriptor do socket

  if (sockfd < 0){ //Verifica criação do file descriptor
    perror("could not create socket");
    return 0;
  }

  int on = 1;//Variável auxiliar na definição de opções
  //Seleciona opção HDRINCL, que significa que o header IP estará incluso no pacote
  if (setsockopt (sockfd, IPPROTO_IP, IP_HDRINCL, (const char*)&on, sizeof(on)) == -1){
    perror("setsockopt");
    return 0;
  }
  if (setsockopt (sockfd, SOL_SOCKET, SO_BROADCAST, (const char*)&on, sizeof(on)) == -1){
    perror("setsockopt");
    return 0;
  }

  //source ip
  struct ifreq ifr;//interface usada para configurar network devices
  ifr.ifr_addr.sa_family = AF_INET;//Usaremos da estrutura if_addr dentro da estrutura ifreq

  ioctl(sockfd, SIOCGIFADDR, &ifr);

  char* packet = (char*) malloc(MAX_LEN);//Aloca espaço para o pacote

  //Cria ponteiros das estruturas utilizadas no pacote e ajusta suas localizações
  struct iphdr* ip = (struct iphdr*) packet;

  memset(packet, 0, MAX_LEN);//Inicia pacote
  int packet_size = create_routerqt(packet, daddr, inet_addr("0.0.0.0"));

  ip->version = 4;
  ip->ihl = 5;
  ip->tos = 0;
  ip->tot_len = htons(packet_size);
  ip->id = 0;
  ip->frag_off = 0;
  ip->ttl = 10;
  ip->protocol = 48;

  FILE* f;

  struct sockaddr_in servaddr;

  char a[20], b[20];
  f = fopen("redes.txt", "r");
  unsigned int addr, mask;
  while(fscanf(f, "%s%s", a, b)!= EOF) {
    rmaddr_routerqt(packet);
    addr = inet_addr(a), mask = inet_addr(b);
    int packet_size = addaddr_routerqt(packet, addr);
    ip = (struct iphdr*) packet;
    ip->saddr = addr;
    ip->daddr = (~mask)|addr;
    ip->check = checksum((unsigned short*) packet, sizeof(struct iphdr));

    servaddr.sin_family = AF_INET;
    servaddr.sin_addr.s_addr = ip->daddr;
    memset(&servaddr.sin_zero, 0, sizeof (servaddr.sin_zero));

    printf("\n\n");
    printpacket((unsigned char*) packet, packet_size);

    if (sendto(sockfd, packet, packet_size, 0, (struct sockaddr*) &servaddr, sizeof (servaddr)) < 1)//Envia pacote e verifica envio
    {
      perror("send failed");
    }
  }
  fclose(f);

  printf("enviada\n");

  free(packet);
  close(sockfd);
  return 0;
}
Example #10
0
udp_pair *
udpdotrace(
    struct ip *pip,
    struct udphdr *pudp,
    void *plast)
{
    udp_pair	*pup_save;
    ucb		*thisdir;
    ucb		*otherdir;
    udp_pair	tp_in;
    int		dir;
    u_short	uh_sport;	/* source port */
    u_short	uh_dport;	/* destination port */
    u_short	uh_ulen;	/* data length */

    /* make sure we have enough of the packet */
    if ((char *)pudp + sizeof(struct udphdr)-1 > (char *)plast) {
	if (warn_printtrunc)
	    fprintf(stderr,
		    "UDP packet %lu truncated too short to trace, ignored\n",
		    pnum);
	++ctrunc;
	return(NULL);
    }


    /* convert interesting fields to local byte order */
    uh_sport = ntohs(pudp->uh_sport);
    uh_dport = ntohs(pudp->uh_dport);
    uh_ulen = ntohs(pudp->uh_ulen);

    /* make sure this is one of the connections we want */
    pup_save = FindUTP(pip,pudp,&dir);

    ++packet_count;

    if (pup_save == NULL) {
	return(NULL);
    }

    ++udp_trace_count;

    /* do time stats */
    if (ZERO_TIME(&pup_save->first_time)) {
	pup_save->first_time = current_time;
    }
    pup_save->last_time = current_time;

    // Lets not waste any more CPU cycles if we are ignoring this connection.
    if (pup_save->ignore_pair)
	  return (pup_save);
     
    /* save to a file if requested */
    if (output_filename) {
	PcapSavePacket(output_filename,pip,plast);
    }

    /* now, print it if requested */
    if (printem && !printallofem) {
	printf("Packet %lu\n", pnum);
	printpacket(0,		/* original length not available */
		    (char *)plast - (char *)pip + 1,
		    NULL,0,	/* physical stuff not known here */
		    pip,plast,NULL);
    }

    /* grab the address from this packet */
    CopyAddr(&tp_in.addr_pair, pip,
	     uh_sport, uh_dport);

    /* figure out which direction this packet is going */
    if (dir == A2B) {
	thisdir  = &pup_save->a2b;
	otherdir = &pup_save->b2a;
    } else {
	thisdir  = &pup_save->b2a;
	otherdir = &pup_save->a2b;
    }


    /* do data stats */
    thisdir->packets += 1;
    thisdir->data_bytes += uh_ulen;


    /* total packets stats */
    ++pup_save->packets;

    return(pup_save);
}