i've made a simple program that change a string from lowercase to uppercase and from uppercase to lowercase. Server works until start client, after client run server give this error: "recv server fallita: Transport endpoint is not connected" why? i think that stream closed too soon or not? below there is code of server:
#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=tolower(inputline);
}
if (strcmp(inputline,"fine")==0){
break;
}
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=toupper(inputline);
}
if (strcmp(inputline,"FINE")==0){
break;
}
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(sock,&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");
send(fd,"Benvenuto al maiuscolatore, minuscolatore\n",27,0);
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");
send(fd,"Benvenuto al maiuscolatore, minuscolatore\n",27,0);
minuscolatore(fd,fd);
printf("Chiusa connessione\n");
}
}
}
close(fd);
}
and the client:
\#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\)
buf[i\+\+]=c;
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\);
\}