Esempio n. 1
0
/*
 * Takes the input line and creates 2 strings (fingerprint and name). 
 * This function also accounts for bad input cases.
 */
void input(Table_T* table)
{
        char fingerprint[FINGER_MAX];
        char name[NAME_MAX];
        char letter = getchar();
        
        while (letter != EOF) {
                /*Badly formed line*/
                if (isspace(letter) || letter == '\n') {
                        letter = skip_line(letter);
                        continue;
                }
                /*Create fingerprint*/
                letter = record_fingerprint(letter, fingerprint);       
                if (!isspace(letter)) {
                        letter = skip_line(letter);
                        continue;
                }
                /*Skip whitespace*/
                while (isspace(letter)) {
                        letter = getchar();
                }
                /*Create name*/
                letter = record_name(letter, name);     
                if (letter != '\n') {
                        letter = skip_line(letter);
                }
                letter = getchar();
                /*Make name and fingerprint atoms*/
                insert_atom(table, fingerprint, name);
        }
}
int main(int argc, char* argv[]){

//variabili

fd_set read_temp_set;
fd_set write_temp_set;
int error;
int max_fd_set;
timeout.tv_sec=60;
timeout.tv_usec=0;
char port[6];
char command [30];
int right=0;
int max_try=3;


// fase iniziale : connessione al server

if(argc!=3){
  	printf("Errore nell'inserimento dei parametri, chiusura in corso...\n");
  	exit(1);
	}

printf("Connessione in corso al server (indirizzo di ascolto %s, porta di ascolto %s)\n",argv[1],argv[2]);
tcp_socket=socket(AF_INET,SOCK_STREAM,0);
if(tcp_socket==-1){
  	perror("Errore creazione socket tcp");
  	exit(1);
	}
udp_socket=socket(AF_INET,SOCK_DGRAM,0);
if(udp_socket==-1){
 	perror("Errore creazione socket udp");
 	close(tcp_socket);
 	exit(1);
	}
	
max_fd_set=(tcp_socket>udp_socket)?tcp_socket:udp_socket;
memset(&server,0, sizeof(server));
memset(&client,0, sizeof(client));
memset(&enemy, 0, sizeof(enemy));
memset(&work, 0, sizeof(work));
enemy.sin_family=AF_INET;
work.sin_family=AF_INET;
client.sin_family=AF_INET;
server.sin_family=AF_INET;
// per il server
server.sin_port=htons(atoi(argv[2]));
inet_pton(AF_INET, argv[1], &server.sin_addr.s_addr);

error=connect(tcp_socket,(struct sockaddr*)&server,addrlen);
if(error==-1){
 	perror("Impossibile connettersi al server");
 	close(tcp_socket);
 	close(udp_socket);
 	exit(1); 
	}

printf("Connessione con il server %s sulla porta %s avvenuta con successo.\n", argv[1], argv[2]);
// segue l'inserimento del nome e della porta di ascolto udp
error=record_name(client_name);
while(error==-1){
	if(max_try!=0){
		printf("Riproviamo...\n");
		error=record_name(client_name);
		max_try--;
		}
	else if(max_try==0){
		printf("Problemi nell'inserimento del nome.Disconnessione...\n");
		close(tcp_socket);
		close(udp_socket);
		exit(1);
	    	}
	}
do{
  	printf("Per favore inserisci il numero di porta udp per il gioco:\n");
	fgets(port,6,stdin);
	if(port[strlen(port)-1]!='\n')
	fflush(stdin);
    	udp_port=atoi(port);
	if(udp_port<1024 || udp_port>=65535)
	printf("Porta upd inserita non valida...\n");
	else right=1;		
	}while(right==0);
udp_port=htons(udp_port);
error=record_udp_port(udp_port);	
if(error==-1){
	printf("Problemi nell'inserimento della porta udp.Disconnessione...\n");
	close(tcp_socket);
	close(udp_socket);
	exit(1);   
	}
// bind() per socket udp
client.sin_port=udp_port;
client.sin_addr.s_addr = INADDR_ANY; // usa il mio indirizzo IP
error=bind(udp_socket, (struct sockaddr*)&client, addrlen);
if(error==-1){
	perror("Errore nella bind della socket udp in ricezione(porta occupata)");
        printf("Server in chiusura...\n");
	close(tcp_socket);
	close(udp_socket);
	exit(1); 
	}
else
printf("Porta udp registrata correttamente presso il server.\n");
// il client deve inserire le varie navi

set_match();
show_commands();
			 
// inizializzo i descrittori

FD_ZERO(&master_read_set);
FD_ZERO(&master_write_set);
FD_SET(0, &master_read_set);//stdin
FD_SET(tcp_socket, &master_read_set);
FD_SET(udp_socket, &master_read_set);
		  
// comincia il corpo del client

do{
	read_temp_set=master_read_set;
	write_temp_set=master_write_set;
	if(shell==0){
	   	if(started_match==0)
		printf(">");
	   	else
		printf("#");
	  	shell=1;
	 	}
	fflush(stdout);
	error=select(max_fd_set+1, &read_temp_set, &write_temp_set, NULL, &timeout);
	if(error==-1){
	   	perror("Errore nella select");
	   	close(tcp_socket);
	   	close(udp_socket);
	   	exit(1);
		}
	else if((error==0) && (started_match!=0)){ // non e' successo niente per 60s durante una partita
	   	printf("Inattivita' durante una partita.\n");
	   	printf("Chiudo la partita con %s. \n",enemy_name);
	   	busy=0;
	   	started_match=0;
	   	tcp_senddim=4;
	   	tcp_message=malloc(4);
	  	*(int*)tcp_message=4;
	   	udp_message[0]=7;//TIPO messaggio
	   	FD_SET(tcp_socket, &master_write_set);
	   	FD_SET(udp_socket, &master_write_set);
	   	FD_CLR(tcp_socket, &master_read_set);
		}
  	// altrimenti controlliamo i socket in lettura
    	if(FD_ISSET(0, &read_temp_set)){
  		// leggo un comando da tastiera
	   	shell = 0;
	   	fgets(command,30, stdin);
	   	if(command[strlen(command)-1]!='\n') fflush(stdin);
	   	else command[strlen(command)-1]='\0';
	   	manage_stdin_command(command);
    		}
    
	if(FD_ISSET(tcp_socket, &read_temp_set)){
		if(tcp_recv1==1){
	   		msg_buffer=malloc(INTEGER);
	   		error=recv(tcp_socket,msg_buffer,INTEGER,0);
	   		if(error==0){
		  		printf("Il server ha chiuso la connessione");
		  		close_conn=1;
		  		break;
        			}
	   		if(error==-1 || error<INTEGER){
		  		perror("Errore nella recive");
		  		close_conn=1;
		  		break;
				}
			tcp_recvdim=*(int*)msg_buffer;
			free(msg_buffer);
			tcp_recv1=0;
			}
		else{
	   		msg_buffer=malloc(tcp_recvdim);
	   		error=recv(tcp_socket,msg_buffer,tcp_recvdim,0);
	   		if(error==0){
		  		printf("Il server ha chiuso la connessione");
		  		close_conn=1;
		  		break;
				}
	   		if(error==-1 || error<tcp_recvdim){
		  		perror("Errore nella recive");
		  		close_conn=1;
		  		break;
				}
			error=manage_tcp_command(msg_buffer);
			free(msg_buffer);
	   		if(error==-1){
		  		printf("Errore nella recive");
		  		close_conn=1;
		  		break;
				}
			tcp_recv1=1;
			shell=0;
			}
  		}
  	if(FD_ISSET(udp_socket, &read_temp_set)){
	 	msg_buffer=malloc(12);
	 	error=recvfrom(udp_socket,msg_buffer,12,0,(struct sockaddr*)&work,&addrlen);
		if(error==-1){
			perror("Errore nella recvfrom");
			close_conn=1;
			break;
			}
	 
    		if((busy==1) && work.sin_addr.s_addr==enemy.sin_addr.s_addr){
			shell=0;
			error=manage_udp_command((int*)msg_buffer);
			if(error==-1){
				printf("Errore nella gestione del comando ricevuto dall'altro giocatore.\n");
				close_conn=1;
				break;
				}
			free(msg_buffer); /***************************************************************/
			}
		// altrimenti ho ricevuto un pacchetto da qualcun'altro
		}
  
  	// controlliamo i socket in scrittura
  
  	if(FD_ISSET(tcp_socket,&write_temp_set)){
	 	if(tcp_send1==1){
			msg_buffer=malloc(INTEGER);
			*(int*)msg_buffer=tcp_senddim;
			error=send(tcp_socket,msg_buffer,INTEGER,0);
			if(error==-1){
		  		perror("Errore nella send");
		  		close_conn=1;
		  		break;
	    			}
			free(msg_buffer);
			tcp_send1=0;			
	  		}
	 	else{
			error=send(tcp_socket,tcp_message,tcp_senddim,0);
			if(error==-1){
		  		perror("Errore nella send");
		  		close_conn=1;
		  		break;
				}
			if(*(int*)tcp_message==5)
			close_conn=1;
			free(tcp_message);
			tcp_send1=1;
			FD_CLR(tcp_socket, &master_write_set);
			FD_SET(tcp_socket, &master_read_set);
			}
		}
  	if(FD_ISSET(udp_socket,&write_temp_set)){
	 	error=sendto(udp_socket,(void*)&udp_message,12,0,(struct sockaddr*)&enemy,addrlen);
	 	if(error==-1){
		 	perror("Errore nella sendto");
		 	close_conn=1;
		 	break;
	  		}
		FD_CLR(udp_socket, &master_write_set);
		}
	}while(close_conn==0);
close(tcp_socket);
close(udp_socket);
printf("\nBye bye!\n");
return 0;	  
}
Esempio n. 3
0
int main(int argc, char *argv[])
{
    QCoreApplication myApp(argc, argv);

    // check input args
    QStringList inputArgs = myApp.arguments();

    if(inputArgs.size() < 2)   {
        qDebug() << "Error: No dbf directory: ";
        qDebug() << "Pass the dbf directory as an argument: ";
        qDebug() << "./dbf2sqlite /my/dbfdir";
        return -1;
    }

    // filter shapefile types
    QStringList dbfFilterList;
    dbfFilterList << "*.dbf";

    // check for all files
    QDir dbfDir = inputArgs[1];
    QStringList dbfDirList = dbfDir.entryList(dbfFilterList,
                                              QDir::Files);

    // get all file paths
    QString fileDbf;
    for(int i=0; i < dbfDirList.size(); i++)   {
        if(dbfDirList[i].contains(".dbf"))   {
            fileDbf = dbfDir.absoluteFilePath(dbfDirList[i]);
        }
    }

    // open the database file
    DBFHandle hDBF = DBFOpen(fileDbf.toLocal8Bit().data(),"rb");
    if(hDBF == NULL)   {
        qDebug() << "Error: Could not open dbf file";
        return -1;
    }

    // set fields to keep based on data type
    QStringList listFieldsToKeep;
    QString dbFileName;

    if(ADMIN0)   {
        dbFileName = "admin0.sqlite";
        listFieldsToKeep
                << "ADMIN"          // administrative name of country
                << "ADM0_A3";       // 3 letter abbreviatesion of admin name
    }

    if(ADMIN1)   {
        dbFileName = "admin1.sqlite";
        listFieldsToKeep
                << "OBJECTID"
                << "NAME_1"         // Admin1 region name
                << "VARNAME_1"      // Admin1 alt name (not very reliable)
                << "NL_NAME_1"      // Admin1 region name in national language (not reliable)
                << "Postal";        // 2 Letter Postal Code (not reliable)
    }

    // get number of fields in db
    size_t numRecords = 0;
    numRecords = DBFGetRecordCount(hDBF);

    if(numRecords > 0)
    {   qDebug() << "Info: DBF file has" << numRecords << "records";   }
    else
    {   qDebug() << "Error: DBF file has no records!";   return -1;   }

    // create sqlite database
    qDebug() << "Info: Creating SQLite Database...";
    Kompex::SQLiteDatabase * pDatabase =
            new Kompex::SQLiteDatabase(dbFileName.toStdString(),
                SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE,0);

    Kompex::SQLiteStatement * pStmt =
            new Kompex::SQLiteStatement(pDatabase);

    // create database schema (flat)
    if(ADMIN1)   {
        qDebug() << "Info: Creating database schema for ADMIN1 profile";

        pStmt->SqlStatement("CREATE TABLE IF NOT EXISTS data("
                            "regionid INTEGER PRIMARY KEY NOT NULL UNIQUE,"
                            "name TEXT NOT NULL,"
                            "code TEXT);");

        // regionid <-> internel shape/record id [integer]
        size_t idx_objectid = DBFGetFieldIndex(hDBF,"OBJECTID");

        // name <-> NAME_1 [text]
        size_t idx_name = DBFGetFieldIndex(hDBF,"NAME_1");

        // code <-> Postal [text]
        size_t idx_code = DBFGetFieldIndex(hDBF,"Postal");

        qDebug() << "Info: Writing records to database...";
        pStmt->BeginTransaction();

        for(size_t i=0; i < numRecords; i++)
        {
            QString record_id = QString::number(i+1);
            QString record_name(DBFReadStringAttribute(hDBF,i,idx_name));
            QString record_code(DBFReadStringAttribute(hDBF,i,idx_code));

            QString inStmt = "INSERT INTO data(regionid,name,code) VALUES(\"" +
                    record_id + "\",\"" +record_name + "\",\"" + record_code + "\");";

            pStmt->SqlStatement(inStmt.toUtf8().data());

//            qDebug() << record_name;

            if(i % 1000 == 0)   {
                qDebug() << "Info: Wrote" << i+1 << "/" << numRecords << "records";
            }
        }

        pStmt->CommitTransaction();
        qDebug() << "Info: Done!";
    }

    // close dbf file
    DBFClose(hDBF);

    // clean up database
    delete pStmt;
    delete pDatabase;

    return 0;
}