Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

transport endpoint is not connected recv socket

Tags:

c

unix

sockets

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[i]=tolower(inputline[i]);
        }
        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[i]=toupper(inputline[i]);
        }
        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 after 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);
}
like image 900
tafazzi87 Avatar asked Jan 06 '12 16:01

tafazzi87


People also ask

What does transport endpoint not connected mean?

Issue. The error message "Transport endpoint is not connected" usually means a brick is offline or otherwise unable to communicate with gluster.

Is recv blocking in C?

In short: yes, it is blocking. But not in the way you think. recv() blocks until any data is readable.

What is the difference between read () and recv ()?

The only difference between recv() and read(2) is the presence of flags. With a zero flags argument, recv() is generally equivalent to read(2) (but see NOTES).

What does socket recv do?

The recv function is used to read incoming data on connection-oriented sockets, or connectionless sockets. When using a connection-oriented protocol, the sockets must be connected before calling recv.


1 Answers

The fd from your accept is the file handle to recv from, not sock

like image 187
KevinDTimm Avatar answered Sep 16 '22 20:09

KevinDTimm