bool GrupPacket::packetHandler ( __rawNetData__ * packetData ){
#ifdef DEBUG
	        std::cout<<PRINT<<" Source Ip ["<<packetData->sourceIp<<" ] Destination Ip [ "<<packetData->destinationIp
			<<"  ]\nSourcePOrt [ "<<packetData->sourcePort<<" ] \nDestinationPOrt ["
		<<packetData->destinationPort<<" ] \nSequence Number [ "<<packetData->sequenceNumber
		<<"] \n AcknowledgeNumber: [ "<<packetData->acknowledgeNumber<<"]\n Flags\n ACK [ "
		<<packetData->networkTcpFlags.__ACK__<<" ] \n SYN[ "<<packetData->networkTcpFlags.__SYN__
		<<" ] \n FIN"<<packetData->networkTcpFlags.__FIN__<<" ] Data Length:[ "
		<<packetData->dataLength<<std::endl;
#endif

	bool    returnValue;

	returnValue = true;
	if ( packetData->networkTcpFlags.__SYN__ || packetData->networkTcpFlags.__FIN__ ){
		isSynFin = true;
		return true;

	}
	if ( packetData->destinationPort == Init::configuration.port ){// 3306  ){ 
		//check whether the packet is acknowledgement packet or not
		//for acknwledgement packet length of the packet is [0] and ACK flag [ set]
		std::cout<<PRINT<<"Outgoing Packet"<<std::endl;
		if ( packetData->dataLength ==0 && packetData->networkTcpFlags.__ACK__  ){
			if ( isSynFin  ){   return true; }
			std::cout<<PRINT<<" ACK FLAG ON-- OUTGOING \n";
			if ( validPack ( false , &conversationDiary [ activeConversationId ] , packetData ) ){
				std::cout<<PRINT<<"VALID ACK -- OUTGOING PACKET \n";
				//insertData into database ( true , activeConversationId , ++packetNumber , packetData );
				returnValue = copyPacket ( true , &conversationDiary [ activeConversationId ] , packetData );
				
				returnValue == true ?returnValue = insertDb( packetData , false , true ): returnValue = false;
				
				
			}else{
				std::cout<<PRINT<<" ACK PACKET NOT VALID--- OUTGOING\n";
				returnValue = false;

			}
			
		}else if ( searchMother ( false , &conversationDiary [ activeConversationId ] , packetData ) && !lastDb ){
			std::cout<<PRINT<<" CONSICUTIEVE PACKETS-- OUTGOING \n";
			returnValue = copyPacket( true , &conversationDiary[ activeConversationId ], packetData );
			if ( packetData->networkTcpFlags.__ACK__ )
			returnValue == true ?returnValue = insertDb( packetData , false , true ):returnValue = false ;
			returnValue == true ?returnValue = insertDb( packetData , false ):returnValue = false ;
			//insert the packet
		}
	       //it's a new packet--start conversation
	       else  { 
		       std::cout<<"It's a fresh Outgoing Packet"<<std::endl;
		       lastDb = false;
		  //     packetNumber = 0;
		        
		       returnValue = copyPacket( true , &conversationDiary [ ++activeConversationId ] , packetData );
		       returnValue == true ?returnValue = insertDb( packetData , true ):returnValue = false ;
		       	//insertpacketSetting( true , ++packet);
	       }
	}else if ( packetData->sourcePort ==  Init::configuration.port  ){// 3306 ){
		std::cout<<PRINT<<" IN COMING PACKET \n";
		if (   packetData ->dataLength == 0 && packetData->networkTcpFlags.__ACK__  ) {
			if ( isSynFin ){  return true;}
			std::cout<<PRINT<<"IT;S ACK PACKET -- IN COMING \n";
			if (  validPack ( true , &conversationDiary [ activeConversationId] , packetData ) ){
			std::cout<<"VALID ACK RESPONSE PACKET -- IN COMING"<<std::endl;
			returnValue = copyPacket( false , &conversationDiary [ activeConversationId ] , packetData );
			returnValue == true ?returnValue = insertDb( packetData , false , true ):returnValue = false ;
			}else{
				std::cerr<<PRINT<<" ACK PACKET NOT VALID-- IN COMING\n";
				returnValue = false;
			}

		}else if ( searchMother ( true , &conversationDiary [activeConversationId ] , packetData ) ){
			std::cout<<PRINT<<"CONTIMNIOUS PACKET--- IN COMING"<<std::endl;
			returnValue = copyPacket( false , &conversationDiary [ activeConversationId ], packetData );
			if ( packetData->networkTcpFlags.__ACK__ )
			returnValue == true ?returnValue = insertDb( packetData , false , true ):returnValue = false ;
			else

			returnValue == true ?returnValue = insertDb( packetData , false ):returnValue = false ;
		} // after sending a request client may get a request response without ACK
	       	else {// freash packet
			std::cout<<"FRESH PACKET -- INCOMING"<<std::endl;
		//	packetNumber = 0;
		        if( isSynFin ) lastDb = true;

			returnValue = copyPacket ( false , &conversationDiary[ ++activeConversationId ] , packetData );
			returnValue == true ?returnValue = insertDb( packetData , true):returnValue = false ;
		}
	}
	isSynFin = false;
	return returnValue;
}
Exemple #2
0
int main(int argc, char *argv[]){
  if (argc < 2){
    puts("Usage: db [FILE]");
    return -1;
  }
  Node list;
  list = readDatabase(argv[1]);

  puts("Welcome to");
  puts(" ____    ____       ");
  puts("/\\  _`\\ /\\  _`\\     ");
  puts("\\ \\ \\/\\ \\ \\ \\L\\ \\   ");
  puts(" \\ \\ \\ \\ \\ \\  _ <\\ ");
  puts("  \\ \\ \\_\\ \\ \\ \\L\\ \\ ");
  puts("   \\ \\____/\\ \\____/ ");
  puts("    \\/___/  \\/___/  ");
  puts("");

  
  // Main loop
  int choice = -1;
  while(choice != 0) {
    puts("Please choose an operation");
    puts("1. Query a key");
    puts("2. Update an entry");
    puts("3. New entry");
    puts("4. Remove entry");
    puts("5. Print database");
    puts("0. Exit database");
    printf("? ");
    scanf("%d", &choice);
    while(getchar() != '\n'); // Clear stdin
    //int found;
    // Node cursor;
    char buffer[128];
    switch(choice){
    case 1: //query
      queryDb(list, buffer);
     break;

    case 2: //update
      updateDb(list, buffer);
      break;

    case 3: //insert
      list = insertDb(list, buffer, buffer, 1);
      break;

    case 4: // Delete
      list = deleteDb(list, buffer);
      break;

    case 5: //print
      printDb(list);
      break;

    case 0: //Fel - prova igen
      // Exit
      puts("Good bye!");
      break;
    default:
      // Please try again
      puts("Could not parse choice! Please try again");
    }
    puts("");
  }
  return 0;
}