Exemple #1
0
// ---------------- MAIN PROGRAM -----------------
// Simple usage: client IP port, or client IP (use default port) 
int main(int argc, char *argv[]) {

   //********************************************************************
   // WSSTARTUP
   //********************************************************************
   
   #if defined _WIN32 
      if (WSAStartup(WSVERS, &wsadata) != 0) {
         WSACleanup();
         printf("WSAStartup failed\n");
      }
   #endif

   //*******************************************************************
   // Initialization
   //*******************************************************************

   //My own
   int SN_Base   = 0;
   int SN_Next   = 0;
   timer.count   = 0;
   timer.enabled = 1;
   char sendpacket[12] [BUFFERSIZE];
   
   memset(&localaddr, 0, sizeof(localaddr));//clean up
   int localPort=1234;
   localaddr.sin_family = AF_INET;
   localaddr.sin_addr.s_addr = INADDR_ANY;//server address should be local
   localaddr.sin_port = htons(localPort);
   memset(&remoteaddr, 0, sizeof(remoteaddr));//clean up

   //localaddr.sin_addr.s_addr = inet_addr(localIP);
   //char localIP[INET_ADDRSTRLEN]="127.0.0.1";
  
   randominit();
  
   //********************************************************************
   
   #if defined __unix__ || defined __APPLE__
      int s;
   #elif defined _WIN32
      SOCKET s;
   #endif
   
   char send_buffer[BUFFERSIZE],receive_buffer[BUFFERSIZE];
   remoteaddr.sin_family = AF_INET;
   
   //*******************************************************************
   //	Dealing with user's arguments
   //*******************************************************************
   
   if (argc != 5) {
      printf("2011 code USAGE: client remote_IP-address port  lossesbit(0 or 1) damagebit(0 or 1)\n");
      exit(1);
   }
   
   remoteaddr.sin_addr.s_addr = inet_addr(argv[1]);//IP address
   remoteaddr.sin_port = htons((u_short)atoi(argv[2]));//always get the port number
   packets_lostbit=atoi(argv[3]);
   packets_damagedbit=atoi(argv[4]);
  
   if (packets_damagedbit<0 || packets_damagedbit>1 || packets_lostbit<0 || packets_lostbit>1){
      printf("2011 code USAGE: client remote_IP-address port  lossesbit(0 or 1) damagebit(0 or 1)\n");
      exit(0);
   }
  
   //*******************************************************************
   //CREATE CLIENT'S SOCKET 
   //*******************************************************************
   
   s = socket(AF_INET, SOCK_DGRAM, 0);//this is a UDP socket
   
   if (s < 0) {
      printf("socket failed\n");
      exit(1);
   }

   //***************************************************************
   //NONBLOCKING OPTION for Windows
   //***************************************************************

   #if defined _WIN32
      u_long iMode=1;
      ioctlsocket(s,FIONBIO,&iMode);
   #endif

   //*******************************************************************
   //SEND A TEXT FILE 
   //*******************************************************************
  
   #if defined __unix__ || defined __APPLE__
      FILE *fin=fopen("file1.txt","r");
   #elif defined _WIN32
      FILE *fin=fopen("file1_Windows.txt","r");
   #endif
  
   if(fin==NULL) {
      printf("cannot open file\n");
      exit(0);
   }

   while (1) {

      //Run the timer if enabled
      if(timer.enabled) {
         timer.count++;
      }
      //--------
      memset(send_buffer, 0, sizeof(send_buffer));//clean up the send_buffer before reading the next line
      
      if(SN_Next < (SN_Base + N_GBN)) { //Error checking
         fgets(send_buffer,SEGMENTSIZE,fin);
      }
     
      if (!feof(fin)) {
         //Send normally
			
         if(SN_Next < (SN_Base + N_GBN)) {
            build_packet(send_buffer, SN_Next, sendpacket[SN_Next]); //Build it
            send_unreliably(s, sendpacket[SN_Next], remoteaddr);     //Send it

            if(SN_Base == SN_Next) {
               timer.enabled = 1; //enable the timer
            }
            SN_Next++;
         }

         //if timedout, send all packets as not acknowledged

         if(timer.count > TIMER_LIMIT) {
            timer.enabled = 1; // enable the timer
				int i;
            for(i = SN_Base; i < SN_Next; i++) {
               send_unreliably(s, sendpacket[i], remoteaddr);
               #if defined __unix__ || defined __APPLE__
                  sleep(1);
               #elif defined _WIN32
                  Sleep(1);
               #endif
            }
         }
         
         #if defined __unix__ || defined __APPLE__
            sleep(1);
         #elif defined _WIN32
            Sleep(1000);
         #endif
        
         //********************************************************************
         //RECEIVE
         //********************************************************************
         
         memset(receive_buffer, 0, sizeof(receive_buffer));
         recv_nonblocking(s,receive_buffer, remoteaddr);//you can replace this, but use MSG_DONTWAIT to get non-blocking recv
         printf("RECEIVE --> %s \n",receive_buffer);
         
         //when CRC check is passed

         if(CRC_check(receive_buffer)) {
            

            if(ACK_SN(receive_buffer) > -1) {
               SN_Base = ACK_SN(receive_buffer) + 1;
            }
            //Stop the timer
            if(SN_Base == SN_Next) {
               timer.enabled = 0;
               timer.count   = 0;
            }
            //Start the timer;
            else {
               timer.enabled = 1;
            }
         }

         #if defined __unix__ || defined __APPLE__
            sleep(1);//wait for a bit before trying the next packet
         #elif defined _WIN32
            Sleep(1000);
         #endif

      }
      else {
         printf("end of the file \n"); 
         memset(send_buffer, 0, sizeof(send_buffer)); 
         sprintf(send_buffer,"CLOSE \r\n");
         send_unreliably(s,send_buffer,remoteaddr);//we actually send this reliably, read UDP_supporting_functions_2016.c

         break;
      }
   }
   
   //*******************************************************************
   //CLOSESOCKET   
   //*******************************************************************
   
   printf("closing everything on the client's side ... \n");
   fclose(fin);
   
   #if defined __unix__ || defined __APPLE__
      close(s);
   #elif defined _WIN32
      closesocket(s);
   #endif

   exit(0);
}
/* MAIN------------------------------------------------------------------------*/
int main(int argc, char *argv[]) 
{
   // WSSTARTUP
	if (WSAStartup(WSVERS, &wsadata) != 0) 
	{
		WSACleanup();
		printf("WSAStartup failed\n");
	}

	// Initialization
	memset(&localaddr, 0, sizeof(localaddr));//clean up
   int localPort=1234;
   localaddr.sin_family = AF_INET;
   localaddr.sin_addr.s_addr = INADDR_ANY;//server address should be local
   localaddr.sin_port = htons(localPort);
   memset(&remoteaddr, 0, sizeof(remoteaddr));//clean up  
   randominit();

   SOCKET s;

   char send_buffer[BUFFESIZE],receive_buffer[BUFFESIZE];
   remoteaddr.sin_family = AF_INET;

	//	Dealing with user's arguments
   if (argc != 5) 
	{
	   printf("2011 code USAGE: client remote_IP-address port  lossesbit(0 or 1) damagebit(0 or 1)\n");
      exit(1);
   }
   remoteaddr.sin_addr.s_addr = inet_addr(argv[1]);//IP address
   remoteaddr.sin_port = htons((u_short)atoi(argv[2]));//always get the port number
   packets_lostbit=atoi(argv[3]);
   packets_damagedbit=atoi(argv[4]);
   if (packets_damagedbit<0 || packets_damagedbit>1 || packets_lostbit<0 || packets_lostbit>1)
	{
	   printf("2011 code USAGE: client remote_IP-address port  lossesbit(0 or 1) damagebit(0 or 1)\n");
	   exit(0);
   }
	

	//CREATE CLIENT'S SOCKET 
   s = socket(AF_INET, SOCK_DGRAM, 0);//this is a UDP socket
   if (s < 0) 
	{
      printf("socket failed\n");
   	exit(1);
   }
	
   //NONBLOCKING OPTION for Windows
   u_long iMode=1;
   ioctlsocket(s,FIONBIO,&iMode);


	//Open A TEXT FILE 
   int counter=0;//sequence of packets
   int ackcounter=0;
   char temp_buffer[BUFFESIZE];
	char CRC_str[BUFFESIZE];

   FILE *fin=fopen("file1_Windows.txt","r");
   if(fin==NULL)
	{
	   printf("cannot open file\n");
	   exit(0);
   }
	
   while (1)
	{
	memset(send_buffer, 0, sizeof(send_buffer));//clean up the send_buffer before reading the next line
	fgets(send_buffer,SEGMENTSIZE,fin);
	if (!feof(fin)) {
		
		//add a headert to the packet with the sequence number
		sprintf(temp_buffer,"PACKET %d ",counter);
		counter++;
		strcat(temp_buffer,send_buffer);
		strcpy(send_buffer,temp_buffer);
		
		//---------coding-------
		temp_buffer[strlen(temp_buffer)-1] = 0;
		sprintf(CRC_str,"%d ",CRCpolynomial(temp_buffer));
		strcat(CRC_str,send_buffer);
		strcpy(send_buffer, CRC_str);
		//----------------------
		
		send_unreliably(s,send_buffer, remoteaddr);		

		Sleep(1000);
		

		//RECEIVE
		memset(receive_buffer, 0, sizeof(receive_buffer));
		recv_nonblocking(s,receive_buffer, remoteaddr);//you can replace this, but use MSG_DONTWAIT to get non-blocking recv
		printf("RECEIVE -->%s__\n",receive_buffer);
		
		
		
		
		//printf("@Alan the CRC check result is %d\n",wy_CRC_check(receive_buffer));
		
		
		

		Sleep(1000);
	}
	else 
	{
		printf("end of the file \n"); 
		memset(send_buffer, 0, sizeof(send_buffer)); 
		sprintf(send_buffer,"CLOSE \r\n");
		send_unreliably(s,send_buffer,remoteaddr);//we actually send this reliably, read UDP_supporting_functions_2012.c
		
		break;
	}
   }

	//CLOSESOCKET   
   printf("closing everything on the client's side ... \n");
   fclose(fin);

   closesocket(s);
   exit(0);
}
// Simple usage: client IP port, or client IP (use default port) 
int main(int argc, char *argv[]) {
#if defined __unix__ || defined __APPLE__
	
#elif defined _WIN32 
//********************************************************************
// WSSTARTUP
//********************************************************************
	if (WSAStartup(WSVERS, &wsadata) != 0) {
		WSACleanup();
		printf("WSAStartup failed\n");
	}
#endif
//*******************************************************************
// Initialization
//*******************************************************************
   memset(&localaddr, 0, sizeof(localaddr));//clean up
   //char localIP[INET_ADDRSTRLEN]="127.0.0.1";
   int localPort=1234;
   localaddr.sin_family = AF_INET;
   //localaddr.sin_addr.s_addr = inet_addr(localIP);
   localaddr.sin_addr.s_addr = INADDR_ANY;//server address should be local
//********************************************************************
   localaddr.sin_port = htons(localPort);
   memset(&remoteaddr, 0, sizeof(remoteaddr));//clean up  
   randominit();
#if defined __unix__ || defined __APPLE__
   int s;
#elif defined _WIN32
   SOCKET s;
#endif
   char send_buffer[BUFFESIZE],receive_buffer[BUFFESIZE];
   remoteaddr.sin_family = AF_INET;
//*******************************************************************
//	Dealing with user's arguments
//*******************************************************************
   if (argc != 5) {
	   printf("2011 code USAGE: client remote_IP-address port  lossesbit(0 or 1) damagebit(0 or 1)\n");
      exit(1);
   }
   remoteaddr.sin_addr.s_addr = inet_addr(argv[1]);//IP address
   remoteaddr.sin_port = htons((u_short)atoi(argv[2]));//always get the port number
   //localaddr.sin_port = htons((u_short)atoi(argv[3]));//always get the port number
   packets_lostbit=atoi(argv[3]);
   packets_damagedbit=atoi(argv[4]);
   if (packets_damagedbit<0 || packets_damagedbit>1 || packets_lostbit<0 || packets_lostbit>1){
	   printf("2011 code USAGE: client remote_IP-address port  lossesbit(0 or 1) damagebit(0 or 1)\n");
	   exit(0);
   }
//*******************************************************************
//CREATE CLIENT'S SOCKET 
//*******************************************************************
   s = socket(AF_INET, SOCK_DGRAM, 0);//this is a UDP socket
   if (s < 0) {
      printf("socket failed\n");
   	exit(1);
   }
#if defined __unix__ || defined __APPLE__

#elif defined _WIN32
   //***************************************************************//
   //NONBLOCKING OPTION for Windows
   //***************************************************************//
   u_long iMode=1;
   ioctlsocket(s,FIONBIO,&iMode);
#endif
//*******************************************************************
//SEND A TEXT FILE 
//*******************************************************************
   int counter=0;//sequence of packets
   int ackcounter=0;
   char temp_buffer[BUFFESIZE];
	char CRC_str[BUFFESIZE];
#if defined __unix__ || defined __APPLE__
   FILE *fin=fopen("file1.txt","r");
#elif defined _WIN32
   FILE *fin=fopen("file1_Windows.txt","r");
#endif
   if(fin==NULL){
	   printf("cannot open file\n");
	   exit(0);
   }
   while (1){
	memset(send_buffer, 0, sizeof(send_buffer));//clean up the send_buffer before reading the next line
	fgets(send_buffer,SEGMENTSIZE,fin);
	if (!feof(fin)) {
		
		//add a headert to the packet with the sequence number
		sprintf(temp_buffer,"PACKET %d ",counter);
		counter++;
		strcat(temp_buffer,send_buffer);
		strcpy(send_buffer,temp_buffer);
		
		//---------coding-------
		temp_buffer[strlen(temp_buffer)-1] = 0;
		sprintf(CRC_str,"%d ",CRCpolynomial(temp_buffer));
		strcat(CRC_str,send_buffer);
		strcpy(send_buffer, CRC_str);
		//printf("testing:the CRC is %d,lenth is %d \n",CRCpolynomial(temp_buffer),strlen(temp_buffer));
		//printf("len= %d    the last four :%d %d %d %d",strlen(temp_buffer),temp_buffer[34],temp_buffer[35],temp_buffer[36],temp_buffer[37]);
		//----------------------
		
		send_unreliably(s,send_buffer, remoteaddr);
		
#if defined __unix__ || defined __APPLE__
		sleep(1);
#elif defined _WIN32
		Sleep(1000);
#endif
	//********************************************************************
	//RECEIVE
	//********************************************************************
		memset(receive_buffer, 0, sizeof(receive_buffer));
		recv_nonblocking(s,receive_buffer, remoteaddr);//you can replace this, but use MSG_DONTWAIT to get non-blocking recv
		printf("RECEIVE --> %s \n",receive_buffer);
#if defined __unix__ || defined __APPLE__
		sleep(1);//wait for a bit before trying the next packet
#elif defined _WIN32
		Sleep(1000);
#endif
	}
	else {
		printf("end of the file \n"); 
		memset(send_buffer, 0, sizeof(send_buffer)); 
		sprintf(send_buffer,"CLOSE \r\n");
		send_unreliably(s,send_buffer,remoteaddr);//we actually send this reliably, read UDP_supporting_functions_2012.c
		
		break;
	}
   }
//*******************************************************************
//CLOSESOCKET   
//*******************************************************************
   printf("closing everything on the client's side ... \n");
   fclose(fin);
#if defined __unix__ || defined __APPLE__
   close(s);
#elif defined _WIN32
   closesocket(s);
#endif

   exit(0);

}