Client server in c

di il
14 risposte

Client server in c

Salve ragazzi,nn sono molto esperto nella programmazione in c,ma mi servirebbe un aiuto o anche delle slide se ne avete a disposizione per creare un programma client server...
sono riuscito a creare la connessione client server,ora dovrei creare delle funzioni...
• fput path/to/file.ext (effettua l’upload sul server del file file.ext);

• fget file.ext path/to/savedir (effettua il download del file file.ext dal server nella
cartella savedir)

• ls (elenca i file e le cartelle contenuti nella cartella locale del client);

• rls (elenca il file nella cartella remota del server);

queste sono alcune funzioni da creare...
chi mi potrebbe aiutare???

grazie mille

14 Risposte

  • Re: Client server in c

    Un professore privato?
  • Re: Client server in c

    In che senso un professore?
    a me servirebbe qualche slide o qualche esempio da poter prendere spunto...tutto qua
  • Re: Client server in c

    Che sistema operativo?compilatore?
  • Re: Client server in c

    Ciao dovrei usare eclipse in c con compilatore MinGW ...
  • Re: Client server in c

    Cosa non riesci a fare?
    Riesci ad inviare e ricevere un messaggio?
    Sai processarlo?
    Posta il codice usato fino adesso negli appositi tag code e vedremo come poterti aiutare.
  • Re: Client server in c

    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>
    #define BUFFERSIZE 512
    #define PROTOPORT 45890
    void ErrorHandler(char *errorMessage) {
    printf(errorMessage);
    }
    void ClearWinSock() {
    #if defined WIN32
    WSACleanup();
    #endif
    }

    int main(void) {
    int _RETURNSTATUS = 0;
    int port;
    char gotAddr[15];
    char* selection = malloc(50);
    #if defined WIN32
    WSADATA wsaData;
    int iResult = WSAStartup(MAKEWORD(2 ,2), &wsaData);
    if (iResult != 0) {
    printf("error at WSASturtup\n");
    return 0;
    }
    #endif

    int bytesRcvd = 0;
    int totalBytesRcvd = 0;
    char buf[BUFFERSIZE]; // buffer for data from the server

    // CREAZIONE DELLA SOCKET
    int Csocket;
    Csocket = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (Csocket < 0) {
    ErrorHandler("socket creation failed.\n");
    closesocket(Csocket);
    ClearWinSock();
    return 0;
    }

    // COSTRUZIONE DELL’INDIRIZZO DEL SERVER
    struct sockaddr_in sad;
    memset(&sad, 0, sizeof(sad));
    sad.sin_family = AF_INET;

    printf("Inserire l'indirizzo del server: ");
    printf("\n(Premere invio per default)");
    fgets(gotAddr, 15, stdin);
    if (strcmp(gotAddr, "\n") != 0) {
    sad.sin_addr.s_addr = inet_addr(gotAddr); // IP del server

    printf("Inserire il numero di porta del server: ");
    scanf("%d", &port);
    fflush(stdin);
    sad.sin_port = htons(port); // Porta del server
    } else {
    sad.sin_addr.s_addr = inet_addr("127.0.0.1");
    sad.sin_port = htons(45890);
    }

    // CONNESSIONE AL SERVER
    if (connect(Csocket, (struct sockaddr *) &sad, sizeof(sad)) < 0) {
    ErrorHandler("Failed to connect.\n");
    closesocket(Csocket);
    ClearWinSock();
    return 0;
    }

    printf("In attesa di connessione col server!");
    if ((bytesRcvd = recv(Csocket, buf, BUFFERSIZE - 1, 0)) <= 0) {
    ErrorHandler("recv() failed or connection closed prematurely");
    closesocket(Csocket);
    ClearWinSock();
    }

    totalBytesRcvd += bytesRcvd; // Keep tally of total bytes
    buf[bytesRcvd] = '\0'; // Add \0 so printf knows where to stop
    printf("\n%s\n", buf); // Print the echo buffer

    char* inputString = "prova"; // Stringa da inviare
    int stringLen = strlen(inputString); // Determina la lunghezza
  • Re: Client server in c

    SERVER
    
    #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> // for atoi()
    #define BUFFERSIZE 512 // LUNGHEZZA BUFFER
    #define PROTOPORT 45890 // default protocol port number
    #define QLEN 9 // size of request queue
    void ErrorHandler(char *errorMessage) {
    	printf(errorMessage);
    }
    void ClearWinSock() {
    #if defined WIN32
    	WSACleanup();
    #endif
    }
    int main(int argc, char *argv[]) {
    	int port;
    	if (argc > 1) {
    		port = atoi(argv[1]); // if argument specified convert argument to binary
    	} else
    		port = PROTOPORT; // use default port number
    	if (port < 0) {
    		printf("bad port number %s \n", argv[1]);
    		return 0;
    	}
    #if defined WIN32 // initialize Winsock
    	WSADATA wsaData;
    	int iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
    	if (iResult != 0) {
    		ErrorHandler("Error at WSAStartup()\n");
    		return 0;
    	}
    #endif
    
    	// 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)); // ensures that extra bytes contain 0
    	sad.sin_family = AF_INET;
    	sad.sin_addr.s_addr = inet_addr("127.0.0.1");
    	sad.sin_port = htons(port); /* converts values between the host and
    	 network byte order. Specifically, htons() converts 16-bit quantities
    	 from host byte order to network byte order. */
    	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
    	int clientLen; // the size of the client address
    	printf("Waiting for a client to connect...");
    	while (1) { /* oppure for (;;) */
    		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(
    				"Il Client e' connesso all'indirizzo %s attraverso la porta %d\n",
    				inet_ntoa(cad.sin_addr), cad.sin_port);
    		send(clientSocket, "Connessione avvenuta!",
    				strlen("Connessione avvenuta!"), 0);
    
    		boolean exit = FALSE;
    
  • Re: Client server in c

    Ora come fa il server a caricare un file.txt??
  • Re: Client server in c

    Fai un passo alla volta:

    inizia con inplementare quello che serve per inviare un messaggio

    cioe':

    1) il client invia un messaggio -> il server lo riceve (e lo processa)
    2) il server invia un messaggio -> il client lo riceve (e lo processa)

    qui la genialata sta' nel concetto di messaggio.

    Che cosa e' un messaggio?

    Banale: un vettore di lunghezza N di byte.

    Che cosa c'e' dentro non te ne puo' fregar de meno, come si dice dalle mie parti .

    Una volta fatto questo, hai fatto il 99.9999999% del lavoro.
    Il resto e' non semplice, nemmeno banale, di piu' !!!
  • Re: Client server in c

    Si,scusami ora metto un altro programma fatto da me con funzioni semplici in cui vengono mandati messaggi dal client al server...
  • Re: Client server in c

    #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();
    void handleConnection(socket_descriptor);
    
    int main(void) {
    
    	initWinSock();
    
    	// CREAZIONE DELLA SOCKET
    	int clientSocket;
    	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");
    
    	handleConnection(clientSocket);
    
    	printf("[INFO] Connessione chiusa\n");
    
    	//free(ip_server);
    	//free(port);
    
    	// CHIUSURA DELLA CONNESSIONE
    	closesocket(clientSocket);
    	clearWinSock();
    
    	return (0);
    
    }
    
    void handleConnection(socket_descriptor clientSocket) {
    	string input = (string) malloc(BUFFERSIZE);
    	string buf = (string) malloc(BUFFERSIZE);
    
    	do {
    		printf("\nScegli tra i seguenti comandi:\n");
    		printf("c s1 s2 (concatena la stringa s1 con s2)\n");
    		printf("u s (converte la stringa s in lettere maiuscole)\n");
    		printf("l s (converte la stringa s in lettere minuscole)\n");
    		printf(
    				"f s1 s2 (restituisce true se s1 occorre in s2, false altrimenti)\n");
    		printf("n s (restituisce la lunghezza della stringa s)\n");
    		printf(
    				"nc s (restituisce il numero di consonanti presenti nella stringa s)\n");
    		printf(
    				"nv s (restituisce il numero di vocali presenti nella stringa s)\n");
    		printf("q (il client si disconnette)\n");
    
    		fgets(input, BUFFERSIZE, stdin);
    
    		int stringLen = strlen(input); // Determina la lunghezza
    
    		input[stringLen - 1] = '\0'; //Elimina il new line finale
    
    		//INIZIO COMUNICAZIONE
    		printf("[INFO] Sto per inviare: \"%s\"\n", input);
    
    		// INVIARE DATI AL SERVER
    		if (send(clientSocket, input, stringLen, 0) != stringLen) {
    			errorHandler("send() error");
    			closesocket(clientSocket);
    			clearWinSock();
    			exit(0);
    		}
    
    		// RICEVERE DATI DAL SERVER
    		int bytesRcvd;
    
    		printf("[INFO] Attendo risposta\n");
    
    		if ((bytesRcvd = recv(clientSocket, buf, BUFFERSIZE - 1, 0)) <= 0) {
    			errorHandler("recv() error");
    			closesocket(clientSocket);
    			clearWinSock();
    			exit(0);
    		}
    		buf[bytesRcvd] = '\0';
    		printf("[INFO] Risposta ricevuta: \"%s\"\n", buf); // Print the echo buffer
    
    	} while (input[0] != 'q');
    
    }
    
    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
    }
    #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 <ctype.h>
    
    #define BUFFERSIZE 512
    #define PORT 45890 // Numero di porta di default
    #define IP "127.0.0.1"
    #define QLEN 10
    
    typedef char * string;
    typedef int socket_descriptor;
    #define TRUE 1
    #define FALSE 0
    
    void errorHandler(string);
    void clearWinSock();
    void initWinSock();
    string c(string, string);
    string u(string);
    string l(string);
    string f(string, string);
    int n(string);
    int nc(string);
    int nv(string);
    string q();
    void handleClient(socket_descriptor);
    
    int main(int argc, char *argv[]) {
    	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);
    
    		handleClient(clientSocket);
    	}
    }
    
    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
    }
    
    string c(string s1, string s2) {
    	string dest[BUFFERSIZE];
    	memset(dest, '\0', BUFFERSIZE);
    	strcat(dest, s1);
    	strcat(dest, s2);
    	return dest;
    }
    
    string u(string s) {
    	int i = 0;
    	for (i = 0; i < strlen(s); i++)
    		s[i] = toupper(s[i]);
    	return s;
    }
    
    string l(string s) {
    	int i = 0;
    	for (i = 0; i < strlen(s); i++)
    		s[i] = tolower(s[i]);
    	return s;
    }
    
    string f(string s1, string s2) {
    	string ret;
    	if (strstr(s2, s1) == NULL)
    		ret = "false";
    	else
    		ret = "true";
    
    	return ret;
    }
    
    int n(string s) {
    	return strlen(s);
    }
    
    int nc(string s) {
    	int i = 0, consonanti = 0, vocali = 0;
    	for (i = 0; i < strlen(s); i++)
    		if ((s[i] == 'a') || (s[i] == 'e') || (s[i] == 'i') || (s[i] == 'o')
    				|| (s[i] == 'u') || (s[i] == 'A') || (s[i] == 'E')
    				|| (s[i] == 'I') || (s[i] == 'O') || (s[i] == 'U'))
    			vocali++;
    
    	consonanti = strlen(s) - vocali;
    	return consonanti;
    }
    
    int nv(string s) {
    	int i = 0, vocali = 0;
    	for (i = 0; i < strlen(s); i++)
    		if ((s[i] == 'a') || (s[i] == 'e') || (s[i] == 'i') || (s[i] == 'o')
    				|| (s[i] == 'u') || (s[i] == 'A') || (s[i] == 'E')
    				|| (s[i] == 'I') || (s[i] == 'O') || (s[i] == 'U'))
    			vocali++;
    	return vocali;
    }
    
    string q() {
    	string ret = (string) malloc(BUFFERSIZE);
    	memset(ret, '\0', BUFFERSIZE);
    	return ret;
    }
    
    void handleClient(socket_descriptor clientSocket) {
    	string buf;
    	int finito = FALSE;
    	buf = (string) malloc(BUFFERSIZE);
    
    	do {
    		printf("[INFO] In attesa di comando\n");
    		int bytesRcvd = recv(clientSocket, buf, BUFFERSIZE - 1, 0);
    		buf[bytesRcvd] = '\0';
    		printf("[INFO] Ricevuto comando: \"%s\"\n", buf);
    
    		string ret = (string) malloc(BUFFERSIZE);
    		string s = (string) malloc(BUFFERSIZE);
    		string s1 = (string) malloc(BUFFERSIZE);
    		string s2 = (string) malloc(BUFFERSIZE);
    		string token = (string) malloc(BUFFERSIZE);
    
    		token = strtok(buf, " ");
    		int size;
    
    		switch (token[0]) {
    		case 'c':
    			s1 = strtok(NULL, " ");
    			s2 = strtok(NULL, " ");
    			ret = c(s1, s2);
    			break;
    		case 'u':
    			s = strtok(NULL, " ");
    			ret = u(s);
    			break;
    		case 'l':
    			s = strtok(NULL, " ");
    			ret = l(s);
    			break;
    		case 'f':
    			s1 = strtok(NULL, " ");
    			s2 = strtok(NULL, " ");
    			ret = f(s1, s2);
    			break;
    		case 'q':
    			ret = "bye";
    			finito = TRUE;
    			break;
    		case 'n':
    			size = strlen(token);
    			printf("LUNGHEZZA %d", size);
    			if (size == 1) {
    				s = strtok(NULL, " ");
    				printf("CALCOLO LUNGHEZZA DI %s", s);
    				int len = n(s);
    				sprintf(ret, "%d", len);
    				printf("SEMBRA SIA %s", ret);
    			} else {
    				switch (token[1]) {
    				case 'c':
    					s = strtok(NULL, " ");
    					int con = nc(s);
    					sprintf(ret, "%d", con);
    					break;
    				case 'v':
    					s = strtok(NULL, " ");
    					int voc = nv(s);
    					sprintf(ret, "%d", voc);
    					break;
    				default:
    					errorHandler("Comando inesistente");
    					break;
    				}
    			}
    			break;
    		default:
    			errorHandler("Comando inesistente");
    			break;
    		}
    
    		printf("[INFO] Il risultato della computazione è \"%s\"\n", ret);
    		int retLen = strlen(ret);
    		if (send(clientSocket, ret, retLen, 0) != retLen) {
    			errorHandler("send() error");
    			closesocket(clientSocket);
    			clearWinSock();
    		}
    
    		printf("[INFO] Risultato inviato\n");
    
    	} while (!finito);
    
    	free(buf);
    }
  • Re: Client server in c

    Nessuno a qualche suggerimento per come effettuare l'upload del file.txt,e dl dowload del file.txt dal server a una cartella x...
  • Re: Client server in c

    inf89 ha scritto:


    nessuno ha ...
    Apri un file, leggilo e invialo come sequenza di messaggi. Dall'altra parte prendi le varie parti e scrivi il corrispondente file.

    E' ovvio che detto così non è risolutivo ma non posso scriverti tutto il codice completo e funzionante ...
  • Re: Client server in c

    Per fare l'upload dovrei fare cosi all'interno del server creare questa funzione

     FILE *f1;
    if((f1=fopen("a.txt","r"))==NULL)
            printf("Impossibile aprire il file!\n");
    */cosi mi apre il file il server ora per salvarlo all'interno della sua cartella come dovrei fare???*/
      fclose(f1);
    
Devi accedere o registrarti per scrivere nel forum
14 risposte