Problem transport endpoint is not connected

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 &lt;stdlib.h&gt;
    \#include &lt;stdio.h&gt;
    \#include &lt;unistd.h&gt;
    \#include &lt;sys/types.h&gt;
    \#include &lt;ctype.h&gt;
    \#include &lt;sys/socket.h&gt;
    \#include &lt;string.h&gt;
    \#include &lt;netinet/in.h&gt;
    \#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&lt;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\)&gt;0\)\{
            printf\("Ho ricevuto la risposta: %s\\n",buf\);
        \}
        else\{
            perror\("seconda receive fallita"\);
            exit\(3\);
        \}
        close\(sockfd\);
        exit\(0\);
    \}

You're reading from the wrong socket. After you do fd=accept(sock, ...) you should be reading from fd, not sock.

1 Like