Server in

di il
3 risposte

Server in

Salve ragazzi ho creato questa connessione client server in tcp,l'obbiettivo e che il server nn si deve mai fermare e puo connettersi contemporaneamente a tre client,il mio ha il problema che dopo che il client si collega e gli manda l'operazione da svolgere,compie l'operazione e termina il suo lavoro cosa nn richiesta,in quanto nn deve mai fermarsi....vi posto il codice sia del client che
SERVER

#if defined WIN32
#include <winsock.h>
#else
#define closesocket close
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#endif

#define WIN32_LEAN_AND_MEAN
#define PATHNAME1 "C:\\client\\dir"
#define PATHNAME2   "C:\\eclipse\\dir"

#include <windows.h>

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>


#include <dirent.h>

#define BUFFERSIZE 512
#define PORT 45890 // Numero di porta di default
#define IP "127.0.0.1"
#define QLEN 3

typedef char * string;
typedef int socket_descriptor;
#define TRUE 1
#define FALSE 0

void errorHandler(string);
void clearWinSock();
void initWinSock();


int main(int argc, char *argv[]) {
	struct operazione{
				char * decisione;
				char * prima;
				char  seconda[1000];
				char   mes [300] ;
			}dati;
	int port_server;
	if (argc > 1) {
		port_server = atoi(argv[1]);
	} else
		port_server = PORT;
	if (port_server < 0) {
		printf("bad port number %s \n", argv[1]);
		return 0;
	}

	initWinSock();

	//CREAZIONE DELLA SOCKET
	int mySocket;
	mySocket = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
	if (mySocket < 0) {
		errorHandler("socket creation failed. \n");
		clearWinSock();
		return 0;
	}

	// ASSEGNAZIONE DI UN INDIRIZZO ALLA SOCKET
	struct sockaddr_in sad;
	memset(&sad, 0, sizeof(sad));
	sad.sin_family = AF_INET;
	sad.sin_addr.s_addr = inet_addr("127.0.0.1");
	sad.sin_port = htons(port_server);

	if (bind(mySocket, (struct sockaddr*) &sad, sizeof(sad)) < 0) {
		errorHandler("bind() failed.\n");
		closesocket(mySocket);
		clearWinSock();
		return 0;
	}

	// SETTAGGIO DELLA SOCKET ALL'ASCOLTO
	if (listen(mySocket, QLEN) < 0) {
		errorHandler("listen() failed.\n");
		closesocket(mySocket);
		clearWinSock();
		return 0;
	}

	// ACCETTARE UNA NUOVA CONNESSIONE
	struct sockaddr_in cad; // structure for the client address
	int clientSocket; // socket descriptor for the client
	unsigned int clientLen; // the size of the client address
	printf("[INFO] Waiting for a client to connect...\n");
	fflush(stdout);

	while (1) {
		clientLen = sizeof(cad); // set the size of the client address
		if ((clientSocket = accept(mySocket, (struct sockaddr *) &cad,
				&clientLen)) < 0) {
			errorHandler("accept() failed. \n");
			// CHIUSURA DELLA CONNESSIONE
			closesocket(mySocket);
			clearWinSock();
			return 0;
		}
		printf("[INFO] Connesso al client %s:%d\n", inet_ntoa(cad.sin_addr),
				cad.sin_port);

		 //Ricevo i dati dal client


		 recv(clientSocket,(char *) &dati,sizeof(struct operazione ),0);





		 if(dati.decisione=='c')
		 	 	 	 	 	 	 	 {
			 	 	 	 	 	 	 	 FILE *f;

 	 	 	 	 	 	 	 	 	 if((f=fopen("file.txt","w")) == NULL){
 	 	 	 	 	 	 	 	 		 printf("impossibile aprire file\n");}



 	 	 	 	 	 	 	 	 	 	 	 	 fputs(dati.seconda,f);

 	 	 	 	 	 	 	 	 	 	fclose (f);


 	 	 	 	 	 	 	 	 	strncpy(dati.mes,"upload avvenuto",300);

 	 	 	 	 	 	 		 printf("esito operazione: %s\n",&dati.mes);
 	 	 	 	 	 	 	 	 send(clientSocket,(char *) &dati,sizeof(struct operazione ),0);
		 	 	 	 	 	 	 	 }

		 else
			 if(dati.decisione=='u'){


				 FILE *input,*output;

				 if((input=fopen("file.txt","r"))==NULL)
				        printf("Il file non puo' essere aperto");
				     else if((output=fopen("C:\\savedir\\file.txt","w"))==NULL)
				        printf("Il file non puo' essere aperto");
				        else{
				        	int ch;
				        	        ch = fgetc(input);
				        	            while (!feof(input)) {
				        	            fputc(ch,output);
				        	            ch = fgetc(input);
				        	            }
				         }
				     fclose(input);
				     fclose(output);

				     strncpy(dati.mes,"dowloand avvenuto",300);
				     printf("esito operazione: %s\n",&dati.mes);
				     send(clientSocket,(char *) &dati,sizeof(struct operazione ),0);


			 	 	 	 	 	 	 	 }



			 else
				 if(dati.decisione=='l'){
					 DIR *dp;
					     struct dirent *dir_p;

					     dp = opendir("C:\\client\\");

					     if ( dp == NULL )
					        exit(1);

					     while( ( dir_p = readdir(dp) ) != NULL )
					            printf("%s\n", dir_p -> d_name);

					     strncpy(dati.mes,"elenco effettuato sul output server",300);
					     				     printf("esito operazione: %s\n",&dati.mes);
					     				     send(clientSocket,(char *) &dati,sizeof(struct operazione ),0);



					     closedir(dp);
					 system("pause");
					     return 0;




				 }
				 else
							 if(dati.decisione=='f'){
								 DIR *dp;
								     struct dirent *dir_p;

								     dp = opendir("C:\\eclipse\\");

								     if ( dp == NULL )
								        exit(1);

								     while( ( dir_p = readdir(dp) ) != NULL )
								            printf("%s\n", dir_p -> d_name);

								     strncpy(dati.mes,"elenco effettuato sul output server",300);
								     				     printf("esito operazione: %s\n",&dati.mes);
								     				     send(clientSocket,(char *) &dati,sizeof(struct operazione ),0);



								     closedir(dp);
								 system("pause");
								     return 0;




					 } else
						if(dati.decisione=='n'){
						 LPCSTR lpcPathname = PATHNAME1;
						 if (!(CreateDirectory(lpcPathname,NULL))) {
						 MessageBox(NULL,"CreateDirectory ha fallito","Errore",MB_ICONERROR | MB_OK);
						return -1;
						}


						strncpy(dati.mes,"cartella creata...\n",300);
						 printf("esito operazione: %s\n",&dati.mes);
						send(clientSocket,(char *) &dati,sizeof(struct operazione ),0);




}

			 else
				   if(dati.decisione=='m'){

					   LPCSTR lpcPathname = PATHNAME2;
					   						 if (!(CreateDirectory(lpcPathname,NULL))) {
					   						 MessageBox(NULL,"CreateDirectory ha fallito","Errore",MB_ICONERROR | MB_OK);
					   						return -1;
					   						}
	           strncpy(dati.mes,"cartella creata...\n",300);
			   printf("esito operazione: %s\n",&dati.mes);
			   send(clientSocket,(char *) &dati,sizeof(struct operazione ),0);


								 								 }







	}
}

void errorHandler(string errorMessage) {
	printf("[ERROR] %s", errorMessage);
}

void clearWinSock() {
#if defined WIN32
	WSACleanup();
#endif
}

//Procedura di inizializzazione del socket
void initWinSock() {
#if defined WIN32
	// Initialize Winsock
	WSADATA wsaData;
	int iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
	if (iResult != 0) {
		errorHandler("Error at WSAStartup()\n");
		exit(0);
	}
#endif
}
CLIENT

#if defined WIN32
#include <winsock.h>
#else
#define closesocket close
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#endif

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>

typedef char * string;
typedef int socket_descriptor;
#define TRUE 1
#define FALSE 0

#define IP_SIZE 16 //lunghezza massima della stringa IP
#define PORT_SIZE 7 //lunghezza massima della stringa IP
#define BUFFERSIZE 512
#define PORT 45890 // Numero di porta di default
#define IP "127.0.0.1" // Indirizzo di default
void errorHandler(string);
void clearWinSock();
void initWinSock();


int main(void) {
	struct operazione{
			char * decisione;
			char * prima;
			char  seconda[1000];
			char   mes[300];
		}dati;


	initWinSock();

	// CREAZIONE DELLA SOCKET
	int clientSocket;
	while(dati.decisione!='q'){
	clientSocket = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
	if (clientSocket < 0) {
		errorHandler("socket creation failed.\n");
		clearWinSock();
		return 0;
	}

	int port_server;
	string ip_server = (string) malloc(IP_SIZE);
	string port = (string) malloc(PORT_SIZE);
	printf("Inserisci l'indirizzo ip del server...(127.0.0.1 di default) ");
	fgets(ip_server, IP_SIZE, stdin);
	printf("Inserisci il numero di porta del server...(45890 di default) ");
	fgets(port, PORT_SIZE, stdin);

	if (strcmp(ip_server, "\n") == 0)
		ip_server = IP;
	else
		ip_server[strlen(ip_server) - 1] = '\0';

	if (strcmp(port, "\n") == 0)
		port_server = PORT;
	else {
		port[strlen(port) - 1] = '\0';
		port_server = atoi(port);
	}

	// COSTRUZIONE DELL’INDIRIZZO DEL SERVER
	struct sockaddr_in sad;
	memset(&sad, 0, sizeof(sad));
	sad.sin_family = AF_INET;
	sad.sin_addr.s_addr = inet_addr(IP); // IP del server
	sad.sin_port = htons(port_server); // Server port

	// CONNESSIONE AL SERVER

	if (connect(clientSocket, (struct sockaddr *) &sad, sizeof(sad)) < 0) {
		errorHandler("Failed to connect.\n");
		printf("ERRORE NUMERO %d", errno);
		closesocket(clientSocket);
		clearWinSock();
		return 0;
	}

	printf("[INFO] Connessione avvenuta\n");

	system("cls");


	  dati.decisione='a';

		   printf("menu\n_________________________________________________\n");

		   printf(" c  (effettua l'upload sul server del file file.ext)\n"
		              " u(effettua il download del file file.ext dal server nella cartella savedir)\n"
		              " l (elenca i file e le cartelle contenuti nella cartella locale del client)\n"
		              " f (elenca il file nella cartella remota del server)\n"
		              " n (crea cartella dir nella cartella locale del client\n"
		              " p (crea cartella dir nella cartella remota del server\n"
    		       	   " q (il client si disconnette)\n");

		       printf("Scegli l'operazione:\n");
		       scanf("%s",&dati.decisione);



 if(dati.decisione =='c')
		        				{
	 	 	 	 	 	 	 	 	 	 printf("viene fatto l'upload del file  di nome file.txt presente \n nella cartella client in C\n");
	 	 	 	 	 	 	 	 	 	dati.prima = 'file.txt';
	 	 	 	 	 	 	//	 printf("seconda parola ricevuta: %s\n",&dati.prima);

	 	 	 	 	 	 	 	 	 	 FILE *f;

	 	 	 	 	 	 	 	 	 	 if((f=fopen("C:\\client\\file.txt","r")) == NULL){
	 	 	 	 	 	 	 	 	 		 printf("impossibile aprire file\n");


	 	 	 	 	 	 	 	 	 	 }

	 	 	 	 	 	 	 	 	 	 char c;
	 	 	 	 	 	 	 	 	 	 int i = 0;
	 	 	 	 	 	 	 	 	 	 c=fgetc(f);

	 	 	 	 	 	 	 	 	 	 while (c!=EOF){dati.seconda[i]=c;
	 	 	 	 	 	 	 	 	 	 c=fgetc(f);
	 	 	 	 	 	 	 	 	 	 i++;


	 	 	 	 	 	 	 	 	 	 }


	 	 	 	 	 	 	 	 	send(clientSocket,(char *) &dati,sizeof(struct operazione ),0);

	 	 	 	 	 	 	 	 	recv(clientSocket,(char *) &dati,sizeof(struct operazione ),0);

                                    printf("esito operazione : %s\n",&dati.mes);


		        				}

 else
	 if(dati.decisione=='u'){
		 	 	 	 	 	 printf("viene fatto dowload del file  di nome file.txt presente \n nella cartella del server"
		 	 	 	 	 			 "in una cartella savedir \n");


		 	 	 	 	 	send(clientSocket,(char *) &dati,sizeof(struct operazione ),0);
		 	 	 	 	recv(clientSocket,(char *) &dati,sizeof(struct operazione ),0);

		 	 	 	  printf("esito operazione : %s\n",&dati.mes);



	 	 	 	 	 	 	 }

	 else
	 	 if(dati.decisione=='l'){


	 		printf("elenca i file presenti nella cartella locale del client\n");
	 		send(clientSocket,(char *) &dati,sizeof(struct operazione ),0);
	 		recv(clientSocket,(char *) &dati,sizeof(struct operazione ),0);

	 		  printf("esito operazione : %s\n",&dati.mes);

	 	 }
	 	 else
	 		 	 if(dati.decisione=='f'){


	 		 		printf("elenca i file presenti nella cartella remota del server\n");
	 		 		send(clientSocket,(char *) &dati,sizeof(struct operazione ),0);
	 		 		recv(clientSocket,(char *) &dati,sizeof(struct operazione ),0);

	 		 	  printf("esito operazione : %s\n",&dati.mes);


	 		 	 }
	 		 	 else
	 		 		 	 if(dati.decisione=='n'){

	 		 		 		 printf("crea cartella dir nella cartella locale del client\n");
	 		 		 		send(clientSocket,(char *) &dati,sizeof(struct operazione ),0);
	 		 		 		recv(clientSocket,(char *) &dati,sizeof(struct operazione ),0);

	 		 		 	  printf("esito operazione : %s\n",&dati.mes);






	 		 		 	 }
	 		 		 	else
	 		 		 		 		 		 	 if(dati.decisione=='m'){
	 		 		 		 		 		 		 printf("crea cartella dir nella cartella remota del server\n");
	 		 		 		 		 		 		send(clientSocket,(char *) &dati,sizeof(struct operazione ),0);
	 		 		 		 		 		 		recv(clientSocket,(char *) &dati,sizeof(struct operazione ),0);

	 		 		 		 		 		 	  printf("esito operazione : %s\n",&dati.mes);




	 		 		 		 		 		 	 }

	}

	printf("[INFO] Connessione chiusa\n");



	// CHIUSURA DELLA CONNESSIONE
	closesocket(clientSocket);
	clearWinSock();

	return (0);

}



void errorHandler(string errorMessage) {
	printf("%s", errorMessage);
}

void clearWinSock() {
#if defined WIN32
	WSACleanup();
#endif
}

//Procedura di inizializzazione del socket
void initWinSock() {
#if defined WIN32
	// Initialize Winsock
	WSADATA wsaData;
	int iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
	if (iResult != 0) {
		errorHandler("Error at WSAStartup()\n");
		exit(0);
	}
#endif
}

3 Risposte

  • Re: Server in

    Scusa ma cosa termina, il client o il server ?
  • Re: Server in

    Il server termina va in crash,il server dopo che manda la risposta al client si chiude...
    invece io voglio che deve essere sempre in connessione....
  • Re: Server in

    Il codice non può essere seguito senza impazzire perché non è correttamente indentato e i blocchi racchiusi dai cicli e dalle if non sono affatto chiari.

    In pratica c'è tanta confusione che un errore non può essere facilmente individuato.

    Al posto delle varie if, dove possibile, usa uno switch e non scrivere tutto in una sola funzione ma usane più di una ... infine chiarisci dove inizia un blocco con { e dove termina con }

    Ad esempio
    
    while(...)
    {
       if(....)
       {
          if(...)
          {
              ...
          }
          else
          {
             ...
          }
       }
    }
    
Devi accedere o registrarti per scrivere nel forum
3 risposte