ora dovrei chiudere invece un server attraverso sempre lo stesso input dato da tastiera da parte del client....purtroppo però non funziona questa cosa perché? cioè il server rimane sempre aperto...
eppure nella stringa inputline c'è fine...
ecco qua il codice sia di client che del server:
SERVER:
codice:
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <ctype.h>
#include <sys/socket.h>
#include <string.h>
#include <netinet/in.h>
#define MAXLENGTH 80
#define SERVERPORT 1313
void minuscolatore (int in,int out){
char inputline[MAXLENGTH];
int len,i;
while((len=recv(in,inputline,MAXLENGTH,0))>0){
for(i=0;i<len;i++){
inputline[i]=tolower(inputline[i]);
}
send(out,inputline,len,0);
}
}
void maiuscolatore(int in,int out){
char inputline[MAXLENGTH];
int len,i;
while((len=recv(in,inputline,MAXLENGTH,0))>0){
for(i=0;i<len;i++){
inputline[i]=toupper(inputline[i]);
}
send(out,inputline,len,0);
}
}
int main(){
int sock,client_len,fd;
char c;
struct sockaddr_in client, server = {AF_INET,htons(SERVERPORT),INADDR_ANY};
if((sock=socket(AF_INET,SOCK_STREAM,0))==-1){
perror("Socket fallita");
exit(1);
}
if(bind(sock,(struct sockaddr *)&server,sizeof server)==-1){
perror("Bind fallita");
exit(2);
}
listen(sock,5);
while(1){
client_len=sizeof(client);
if((fd=accept(sock,(struct sockaddr *)&client,&client_len))<0){
perror("accept fallita");
exit(3);
}
if (recv(fd,&c,1,0)==-1){
perror("recv server fallita");
exit(4);
}
if (c=='+'){
switch(fork()){
case -1:
perror("Fork fallita");
exit(4);
case 0:
printf("Aperta connessione\n");
maiuscolatore(fd,fd);
printf("Chiusa connessione\n");
}
}
else if (c=='-'){
switch(fork()){
case -1:
perror("Fork fallita");
exit(4);
case 0:
printf("Aperta connessione\n");
char inputline[MAXLENGTH];
int len,i;
while((len=recv(fd,inputline,MAXLENGTH,0))>0){
for(i=0;i<len;i++){
inputline[i]=tolower(inputline[i]);
}
send(fd,inputline,len,0);
printf ("\n%s\n",inputline);
if (strcmp(inputline,"fine")==0){
printf ("\nChiudo il server");
break;
}
}
printf("Chiusa connessione\n");
}
}
close(fd);
}
}
CLIENT:
codice:
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <ctype.h>
#include <sys/socket.h>
#include <string.h>
#include <netinet/in.h>
#define MAXLENGTH 80
#define SERVERPORT 1313
int main(){
int sockfd;
struct sockaddr_in server={AF_INET,htons(SERVERPORT),INADDR_ANY};
int i=0, len;
char buf[MAXLENGTH],c,d;
if ((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1){
perror("socket fallita");
exit(1);
}
if (connect(sockfd, (struct sockaddr *) &server,sizeof server)==-1){
perror("connect fallita");
exit(2);
}
printf("\nDigita una stringa :");
while((c=getchar())!='\n' && i<MAXLENGTH){
if(isalpha(c)!=0){
buf[i++]=c;}
else{
i++;
}
}
buf[i]='\0';
len=strlen(buf);
printf("\nScrivi + se vuoi tutto maiuscolo e - se vuoi tutto minuscolo:");
d=getchar();
if (send(sockfd,&d,1,0)==-1){
perror("send d fallita");
exit(4);
}
printf("\nInvio la stringa al server...\n");
if(send(sockfd,buf,len,0)==-1){
perror("send fallita");
exit(4);
}
if(recv(sockfd,buf,len,0)>0){
printf("Ho ricevuto la risposta: %s\n",buf);
}
else{
perror("seconda receive fallita");
exit(3);
}
close(sockfd);
exit(0);
}