Programma in C (su Unix) : Client - Server (mediante UDP)
 Inviato: 21 apr 2004, 16:59
Inviato: 21 apr 2004, 16:59Sto realizzando in C questi 2 programmi.
L'esercizio è fare un programma server che resta in background in ascolto su una porta, e un programma client che lanciato (come il server) da riga di comando sia in grado di trasmettere delle stringhe al server.
Una volta fatta questa operazione il server dovrà metterle a video, convertendo la stringa in Uppercase.
io fin ora ho fatto questi due programmi ma c'è qualcosa che on va... se qualcuno è volenteroso e gli va di darmici una debuggata mi fa piacere 
 
PROGRAMMA SERVER :
PROGRAMMA CLIENT :
Grazie
			L'esercizio è fare un programma server che resta in background in ascolto su una porta, e un programma client che lanciato (come il server) da riga di comando sia in grado di trasmettere delle stringhe al server.
Una volta fatta questa operazione il server dovrà metterle a video, convertendo la stringa in Uppercase.
io fin ora ho fatto questi due programmi ma c'è qualcosa che on va... se qualcuno è volenteroso e gli va di darmici una debuggata mi fa piacere
 
 
PROGRAMMA SERVER :
- Codice: Seleziona tutto
- #include <netdb.h>
 #include <stdio.h>
 #include <string.h>
 #include <fcntl.h>
 #include <signal.h>
 #include <unistd.h>
 #include <wctype.h>
 
 #define TRUE 1
 #define FALSE 0
 #define MSGLEN 100
 
 int pid;
 int rett;
 
 int gen_chan, gen_addrlen, channel;
 char buffer[MSGLEN], msg_tocli[MSGLEN];
 struct sockaddr_in gen_addr, chan_addr;
 struct hostent * hp, * gethostbyname();
 int rbcount, rnbcount, rerr_flag, rend_flag,
 wbcount, wnbcount, werr_flag, i;
 
 void leggiporta()
 {
 printf("Sono in leggiporta\n");
 rnbcount=0;
 rbcount = recvfrom(gen_chan,buffer,MSGLEN,0,(struct sockaddr*)&gen_addrlen, &gen_addrlen);
 for (i=0;i<buffer[0];i++) {
 buffer[i]=towupper(buffer[i]);
 }
 printf("\nserver: message received => %s\n",buffer);
 strcpy (msg_tocli,"OK!");
 wbcount = sendto(gen_chan,msg_tocli,MSGLEN,0,(struct sockaddr*)&gen_addrlen, gen_addrlen);
 }
 main(argc,argv)
 int argc;
 char **argv;
 {
 // socket
 if ((gen_chan=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP))==-1){
 perror("\n[server s (init)]");
 exit(1);
 }
 
 // riservata solo all'udp
 gen_addr.sin_family = AF_INET;
 gen_addr.sin_addr.s_addr=htonl(INADDR_ANY);
 gen_addr.sin_port=htons(atoi(argv[1]));
 gen_addrlen = sizeof(gen_addr);
 // binding
 if (bind( gen_chan,(struct sockaddr *) &gen_addr, gen_addrlen)==-1){printf("Bind error\n");}
 printf("\nserver: port is %d\n", ntohs(gen_addr.sin_port));
 
 do {
 printf("\nserver: opening a connection \n");
 if (signal(SIGIO,SIG_IGN)!=SIG_ERR) leggiporta();
 sleep(1);
 printf("Attesa prossimo messaggio:\n");
 } while (TRUE);
 }
PROGRAMMA CLIENT :
- Codice: Seleziona tutto
- #include <stdio.h>
 #include <sys/types.h>
 #include <sys/socket.h>
 #include <netinet/in.h>
 #include <netdb.h>
 #include <errno.h>
 
 #define TRUE 1
 #define FALSE 0
 #define MSGLEN 100
 
 main (argc, argv )
 int argc;
 char **argv;
 {
 int not_error, channel, chan_addrlen;
 char msg_tosend[MSGLEN], msg_torcv[MSGLEN];
 struct sockaddr_in chan_addr;
 struct hostent *hp, *gethostbyname();
 //socket
 if ((channel = socket( AF_INET, SOCK_DGRAM, IPPROTO_UDP))==-1)
 {
 perror("\nclient: error opening socket\n");
 exit(1);
 }
 bzero(&chan_addr,sizeof(chan_addr));
 chan_addr.sin_family = AF_INET;
 chan_addr.sin_addr.s_addr=htonl(INADDR_ANY);
 chan_addr.sin_port = htons (atoi(argv[2]));
 chan_addrlen = sizeof(chan_addr);
 hp = gethostbyname(argv[1]);
 bcopy (hp->h_addr, &(chan_addr.sin_addr.s_addr), hp->h_length);
 printf("\nclient: host is %s, port is %d\n", argv[1], ntohs(chan_addr.sin_port));
 not_error=TRUE;
 // bind
 if (bind(channel,(struct sockaddr*)&chan_addr,chan_addrlen)==-1) perror("\nclient: error binding ");
 printf("\nclient: port is %d\n", ntohs(chan_addr.sin_port));
 do {
 printf("\nclient: type a string => ");
 if (gets(msg_tosend) == NULL ) {
 close(channel);
 exit(1);
 }
 // fin qui funge
 if (sendto(channel, msg_tosend, sizeof(msg_tosend), 0,(struct sockaddr*)&chan_addr,htons(atoi(argv[1])))==-1) {
 perror("\nclient: error writing socket \n");
 not_error = FALSE;
 }
 if (recvfrom(channel, msg_torcv, sizeof(msg_torcv), 0,(struct sockaddr*)&chan_addr,&chan_addrlen)==-1) {
 perror("\nclient: error reading socket \n");
 not_error = FALSE;
 }
 printf("\nclient: this is the answer => %s\n", msg_torcv);
 } while (not_error);
 close(channel);
 }
Grazie