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