07/02/09 11:41
MagoAntò
Ciao a tutti!
Sono alle primissime armi con la programmazione C e sto cercando di creare una semplice applicazione client-server. Il mio problema è il seguente: riesco a far comunicare client e server ma non riesco a fare in modo che il server invii al client un array di puntatori a caratteri. In pratica, dovrei creare un'applicazione per la gestione di una pizzeria; il client invia un intero al server che, a sua volta, deve trasmettere al client un intero array di puntatori a caratteri che contiene il menù delle pizze. Considerando che il codice è ancora da completare, vi posto quello che ho fatto fin'ora:
Server:
Client:
In allegato, trovare uno screenshot dell'output generato dal programma.
Vi ringrazio in anticipo,
Antonio
Sono alle primissime armi con la programmazione C e sto cercando di creare una semplice applicazione client-server. Il mio problema è il seguente: riesco a far comunicare client e server ma non riesco a fare in modo che il server invii al client un array di puntatori a caratteri. In pratica, dovrei creare un'applicazione per la gestione di una pizzeria; il client invia un intero al server che, a sua volta, deve trasmettere al client un intero array di puntatori a caratteri che contiene il menù delle pizze. Considerando che il codice è ancora da completare, vi posto quello che ho fatto fin'ora:
Server:
#include <stdio.h> #include <winsock.h> #include <string.h> int main(int argc, char *argv[]) { SOCKET listenSocket; SOCKET remoteSocket; SOCKADDR_IN Server_addr; SOCKADDR_IN Client_addr; int i, sin_size, scelta_effettuata; short port; int wsastartup; int ls_result; char *pizze [] = {"01. Margherita \t\t\t3,10 Euro", "02. Olio e pomodoro \t\t2,80 Euro", "03. Ripieno \t\t\t4,20 Euro", "04. Quattro stagioni \t\t4,50 Euro", "05. Capricciosa \t\t\t4,50 Euro", "06. Filetto di pomodoro \t\t4,20 Euro"}; char *bibite [] = {"01. Coca cola \t\t\t1,00 Euro", "02. Birra \t\t\t1,50 Euro", "03. Aranciata \t\t\t1,00 Euro", "04. Minerale \t\t\t0,50 Euro"}; /* Inizializzazione della libreria Socket */ WORD wVersionRequested = MAKEWORD(2,2); WSADATA wsaData; wsastartup = WSAStartup(wVersionRequested, &wsaData); if (wsastartup != NO_ERROR) printf("Errore WSAStartup()\n"); /* Creazione della Socket che si porrà in ascolto di richieste del Client*/ listenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (listenSocket < 0) printf("Server: errore nella creazione della socket.\n"); else printf("La Listening Socket e' partita\n"); /* Effettua la bind sull’indirizzo e porta ora specificati */ port = 4000; Server_addr.sin_family = AF_INET; Server_addr.sin_addr.s_addr = inet_addr ("127.0.0.1"); Server_addr.sin_port = htons(port); if (bind(listenSocket,(SOCKADDR*)&Server_addr,sizeof(struct sockaddr_in)) < 0) printf("Server: errore durante la bind.\n"); /* La socket si pone in "ascolto" tramite la listen() */ ls_result = listen(listenSocket, SOMAXCONN); if (ls_result < 0) printf("Server: errore durante la listen.\n"); else printf("La Socket e' in Ascolto\n"); /* La socket accetta la richiesta di connessione del Client */ sin_size = sizeof(struct sockaddr_in); remoteSocket = accept(listenSocket, (struct sockaddr *)&Client_addr,&sin_size); printf("Accettata Connessione con Client: %s\n",inet_ntoa(Client_addr.sin_addr)); /* Il Server accetta il messaggio dal Client */ recv(remoteSocket, (char *)&scelta_effettuata, sizeof(int), 0); printf("Messaggio Arrivato: %d \n", scelta_effettuata); for (i=0; i<6; i++) { send(remoteSocket,pizze[i], strlen(pizze[i]),0); printf ("Sto inviando: %s\n", pizze[i]); } printf("Chiudo il Server\n"); close(remoteSocket); WSACleanup(); return 0; }
Client:
#include <stdio.h> #include <winsock.h> #include <string.h> int main() { int scelta, i; SOCKET clientsocket; SOCKADDR_IN addr; short port; char pizze [100]; WORD wVersionRequested = MAKEWORD(2,2); WSADATA wsaData; WSAStartup(wVersionRequested, &wsaData); printf ("\t\t\t* PIZZERIA BELLA NAPOLI *\n\t\t\t Viale Dei Giardini, 121\n\t\t\t Tel. 081-102030\n\n\n\t\t\t MENU' PRINCIPALE\n"); printf ("1. Visualizza menu' pizze\n2. Visualizza bibite\n3. Effettua ordinazione\n4. Esci\n\n"); printf ("Digita la tua scelta: "); scanf ("%d", &scelta); while ((scelta <1) || (scelta>4)) { scelta = 0; printf ("Hai digitato un valore non valido. Riprova.\n"); printf ("Digita la tua scelta: "); scanf ("%d", &scelta); } if (scelta <4) { port = 4000; addr.sin_family = AF_INET; addr.sin_addr.s_addr = inet_addr("127.0.0.1"); addr.sin_port = htons(port); clientsocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (connect(clientsocket, (LPSOCKADDR)&addr, sizeof(addr)) < 0) printf("Errore nella connessione con il Server"); send(clientsocket,(char *)&scelta, sizeof(int),0); //for (i=0; i<6; i++) { recv (clientsocket, pizze, strlen(pizze),0); printf ("%s\n", pizze); } //WSACleanup(); PERCHE'??? } return 0; //system ("CLS"); }
In allegato, trovare uno screenshot dell'output generato dal programma.
Vi ringrazio in anticipo,
Antonio
Ultima modifica effettuata da MagoAntò 07/02/09 12:24
aaa