예제 #1
0
파일: crcref.c 프로젝트: SirAbedi/streamit
void begin(void)
{
  /* Main loop: */
  while (numiters == -1 || numiters-- > 0)
  {
    int in = getInput();
    int out = doCRC(in);
#ifdef raw
    print_int(out);
#else
    printf("%d\n", out);
#endif
  }
}
예제 #2
0
파일: ftwid.c 프로젝트: dennisg0505/UCLA-CS
int main(int argc, char *argv[]) {
  
  int sd, rc, n, cliLen, done, i, dsize, seq_number, file_created, dropped;
  int test_flag, n_send_packets, i2;
  FILE *f, *f2;
  fd_set rfd;
  fd_set c_rfd;  
  char filename[200];
  unsigned short CRC;
  struct sockaddr_in cliAddr, servAddr;
  struct timeval tv;
  struct DataAck Ack;
  struct FileData FData, FDataBuffer[5], testFEC;  

  test_flag = FALSE;
  if ( argc == 2 ) {
        if ( strcmp(argv[1], "-t") == 0) {
          printf ("*********** Test mode enabled ************\n");
          test_flag = TRUE;
        }
        else {
         printf ("usage: %s -t \n", argv[0]);
         exit(1);
        }
  }     


  /* socket creation */
  sd=socket(AF_INET, SOCK_DGRAM, 0);
  if(sd<0) {
    printf("%s: cannot open socket \n",argv[0]);
    exit(1);
  }

  /* bind local server port */
  servAddr.sin_family = AF_INET;
  servAddr.sin_addr.s_addr = htonl(INADDR_ANY);
  servAddr.sin_port = htons(LOCAL_SERVER_PORT);
  rc = bind (sd, (struct sockaddr *) &servAddr,sizeof(servAddr));
  if(rc<0) {
    printf("%s: cannot bind port number %d \n", 
	   argv[0], LOCAL_SERVER_PORT);
    exit(1);
  }

  cliLen = sizeof(cliAddr);
  
  printf("FTWID started\n");
  printf("Ready for transmition on port UDP %d\n" ,LOCAL_SERVER_PORT);

  /* start receiving data process */

  /* calculate size of file descriptors table */  
  dsize = getdtablesize();

  done = FALSE;

  tv.tv_sec = 0;
  tv.tv_usec = 80000;  	


  seq_number = 1; /* start sequence number */
  file_created = FALSE;
  bzero( &Ack, sizeof(Ack) );

  while ( !(done) ) {

	Ack.seq_n = seq_number;

	#ifdef DEBUG_MODE
	  printf ("Waiting for packets in sequence %d\n", seq_number);
	#endif

	  /* receive all packets */
	  /* test flag case */
	  if ( test_flag ) n_send_packets = 4;
	  else n_send_packets = 5; /* to include the FEC */
	  
	  for ( i = 0; i < n_send_packets; i++ ) 
	  {

	     /* read the data in the socket */
             n = recvfrom ( sd, (char *) &FData, sizeof(FData), 0, (struct sockaddr *) &cliAddr, &cliLen);

	     #ifdef DEBUG_MODE
	     //  printf("Packet number %d, seq %d received\n", FData.packet_n, FData.seq_n);
	     #endif
	

	     #ifdef SHOW_DATA_TRANS
	       printf("\n\n%s\n\n",FData.data);
	     #endif

	     /* Checking for drooped packets */
	     if ( !(test_flag) )
	     if ( drop() == 0 ) {
		#ifdef DEBUG_MODE
		  printf ("\nPacket %d, sequence %d drooped by drop\n\n", FData.packet_n, FData.seq_n);
		#endif 
		continue;
	     }

             if ( n < 0 ) {
              printf ("Fail to receive data file\n");
              exit(1);
             }

	     /* wait for next data packet or timeout */         
	     if ( !(test_flag) ) 
	     {
  		FD_ZERO(&rfd);
  		FD_SET(sd, &rfd);
  		c_rfd = rfd;	     	
                rc = select ( dsize, &c_rfd, NULL, NULL, &tv );

	       /* if time out */
	       if ( rc == 0 ) {
	  	  #ifdef DEBUG_MODE
		    printf ( "Packet number %d, seq %d timed out, skiped\n", i, seq_number);
		  #endif

		  continue; /* skip that packet */
	       }

	       #ifdef DEBUG_MODE
	         printf("Processing packet %d, seq %d\n", FData.packet_n, FData.seq_n);
	       #endif

	     } /* after obtaining the data */	     
	       
	       /* process the data */
	       /* First check for CRC error */
	       /* in case of error, skip packet */
	       
	       /* */
	       if ( !(test_flag) ) {
		  CRC = doCRC ( (char *) &FData, sizeof(FData) - sizeof(FData.CRC) );
		  if ( CRC != FData.CRC ) {
		  	
		    #ifdef DEBUG_MODE
		      printf ("CRC ERROR.\n\n");
		    #endif
		    
		    continue; 	
		  }
		}
		/* */

	       /* ignore sequence number */
	       if (test_flag) FData.seq_n = seq_number; 

	       /* if the sequence number is correct */
	       if ( FData.seq_n == seq_number ) {
	         /* copy the data into the right buffer */
	         memcpy ( FDataBuffer[FData.packet_n].p_type, FData.p_type, sizeof(FData.p_type) );
	         memcpy ( FDataBuffer[FData.packet_n].filename, FData.filename, sizeof(FData.filename) );
	         memcpy ( FDataBuffer[FData.packet_n].data, FData.data, sizeof(FData.data) );
	         FDataBuffer[FData.packet_n].file_size = FData.file_size;
                 FDataBuffer[FData.packet_n].file_mode = FData.file_mode;
                 FDataBuffer[FData.packet_n].seq_n     = FData.seq_n;
                 FDataBuffer[FData.packet_n].packet_n  = FData.packet_n;
                 FDataBuffer[FData.packet_n].data_size = FData.data_size;
                 FDataBuffer[FData.packet_n].eof       = FData.eof;

	         /* Update Ack Packet */
	         if ( FData.packet_n == 0 ) Ack.pck1 = TRUE;
                 if ( FData.packet_n == 1 ) Ack.pck2 = TRUE;
                 if ( FData.packet_n == 2 ) Ack.pck3 = TRUE;
                 if ( FData.packet_n == 3 ) Ack.pck4 = TRUE;
                 if ( FData.packet_n == 4 ) Ack.fet  = TRUE;                 
	        }
	  } /* for each Data packet */
 
	  /* after all packets have been sucessfully received or timed out */
	  /* FET */

	  /* RE-Create Packet 0 if needed */

	  if ( !(test_flag ) ){
	    if ( !Ack.pck1 && Ack.pck2 && Ack.pck3 && Ack.pck4 && Ack.fet ) {

		doFEC ( (char *) &FDataBuffer[1], (char *) &FDataBuffer[2], (char *) &FDataBuffer[0], sizeof(FDataBuffer[0]) );
                doFEC ( (char *) &FDataBuffer[3], (char *) &FDataBuffer[0], (char *) &FDataBuffer[0], sizeof(FDataBuffer[0]) );
                doFEC ( (char *) &FDataBuffer[4], (char *) &FDataBuffer[0], (char *) &FDataBuffer[0], sizeof(FDataBuffer[0]) );

		FDataBuffer[0].seq_n = seq_number;
		FDataBuffer[0].packet_n = 0;
		Ack.pck1 = TRUE;

		#ifdef DEBUG_MODE
		  printf ( "\n******* Recreating packet 1, seq %d from FEC\n", seq_number );
		#endif

		#ifdef SHOW_DATA_TRANS
		  printf ("\n\n%s\n\n", FDataBuffer[0].data);
		#endif
	    }
            if ( Ack.pck1 && !Ack.pck2 && Ack.pck3 && Ack.pck4 && Ack.fet ) {
 
                doFEC ( (char *) &FDataBuffer[0], (char *) &FDataBuffer[2], (char *) &FDataBuffer[1], sizeof(FDataBuffer[0]) );
                doFEC ( (char *) &FDataBuffer[3], (char *) &FDataBuffer[1], (char *) &FDataBuffer[1], sizeof(FDataBuffer[0]) );
                doFEC ( (char *) &FDataBuffer[4], (char *) &FDataBuffer[1], (char *) &FDataBuffer[1], sizeof(FDataBuffer[0]) );
 
                FDataBuffer[1].seq_n = seq_number;
                FDataBuffer[1].packet_n = 1;
		Ack.pck2 = TRUE;             
                
		#ifdef SHOW_DATA_TRANS
		  printf ("\n\n%s\n\n", FDataBuffer[1].data);
		#endif                
	    }          
            if ( Ack.pck1 && Ack.pck2 && !Ack.pck3 && Ack.pck4 && Ack.fet ) {
                
                doFEC ( (char *) &FDataBuffer[0], (char *) &FDataBuffer[1], (char *) &FDataBuffer[2], sizeof(FDataBuffer[2]) );
                doFEC ( (char *) &FDataBuffer[3], (char *) &FDataBuffer[2], (char *) &FDataBuffer[2], sizeof(FDataBuffer[2]) );
                doFEC ( (char *) &FDataBuffer[4], (char *) &FDataBuffer[2], (char *) &FDataBuffer[2], sizeof(FDataBuffer[2]) );
                 
                FDataBuffer[2].seq_n = seq_number;
                FDataBuffer[2].packet_n = 2;
		Ack.pck3 = TRUE;

                #ifdef DEBUG_MODE
                  printf ( "\n******* Recreating packet 3, seq %d from FEC\n", seq_number );
                #endif
             
                #ifdef SHOW_DATA_TRANS
                  printf ("\n\n%s\n\n", FDataBuffer[2].data);
                #endif
            }      
            if ( Ack.pck1 && Ack.pck2 && Ack.pck3 && !Ack.pck4 && Ack.fet ) {
                
                doFEC ( (char *) &FDataBuffer[0], (char *) &FDataBuffer[1], (char *) &FDataBuffer[3], sizeof(FDataBuffer[3]) );
                doFEC ( (char *) &FDataBuffer[2], (char *) &FDataBuffer[3], (char *) &FDataBuffer[3], sizeof(FDataBuffer[3]) );
                doFEC ( (char *) &FDataBuffer[4], (char *) &FDataBuffer[3], (char *) &FDataBuffer[3], sizeof(FDataBuffer[3]) );
                 
                FDataBuffer[3].seq_n = seq_number;
                FDataBuffer[3].packet_n = 3;
		Ack.pck4 = TRUE;

                #ifdef DEBUG_MODE
                  printf ( "\n******* Recreating packet 4, seq %d from FEC\n", seq_number );
                #endif
             
                #ifdef SHOW_DATA_TRANS
                  printf ("\n\n%s\n\n", FDataBuffer[3].data);
                #endif
            }
	  }      
	  /* END FET */

	  /* send ack for what needs to be re-transmitted that can not be recovered or has problems */
	  strcpy ( Ack.p_type, P_TYPE_ACK );
	  if ( Ack.pck1 && Ack.pck2 && Ack.pck3 && Ack.pck4 ) {
		#ifdef DEBUG_MODE
		  printf ("All packets have been ack\n");
		#endif
		Ack.seq_n = seq_number++;
	  }
	   else {
	     Ack.seq_n = seq_number -1;
	   }

	   /* if test flag ignore Acks */
	   if ( !(test_flag) )
	   n = sendto(sd, (char *) &Ack, sizeof(Ack), 0, (struct sockaddr *) &cliAddr, sizeof(cliAddr));

	   #ifdef DEBUG_MODE
	     printf ("Send Ack seq: %d\n", Ack.seq_n);	  
	   #endif


	   if ( test_flag ) {
	     Ack.pck1 = 1;
	     Ack.pck2 = 1;
	     Ack.pck3 = 1;
	     Ack.pck4 = 1;
	   }

	   /* in case all packets are fine */
	   if ( Ack.pck1 && Ack.pck2 && Ack.pck3 && Ack.pck4 ) {

		/* create file if needed */
		if ( !file_created ) {

		  /* print received message */
		  printf ("Transmition started from %s : UDP %u\n", inet_ntoa(cliAddr.sin_addr), ntohs(cliAddr.sin_port));
		  printf ("File name: %s\n", FDataBuffer[0].filename);
		  printf ("File size: %d\n", FDataBuffer[0].file_size);
		  printf ("Connection stablished.\n");

		  strcpy ( filename, FDataBuffer[0].filename );
		  strcat ( filename, ".sent");
		  f = fopen ( filename, "w" );
		  chmod ( filename, FDataBuffer[0].file_mode );
		  file_created = TRUE;
		}

		/* write buffers to file */
		for ( i = 0; i < 4; i++ ) {
		  for ( i2 = 0; i2 < 5; i2++ ) {
		   if ( FDataBuffer[i2].packet_n == i ) {
                      if ( fwrite( &FDataBuffer[i2].data, 1, FDataBuffer[i2].data_size, f ) < 0 ) {
                        printf ("Failed to write to file \n");
                        fclose(f);
                      }
		      if (FDataBuffer[i2].eof == 1)  done = 1;
		      break;    
		   }
		  }
    		}

	     bzero( &Ack, sizeof(Ack) );
	   } /* if all files are fine */
  }
    
  printf ("\nFile Transmission done.\n");

  fclose(f);

  return 0;

}