[C] problema con socket

Jokeris

Utente Attivo
25
0
Ho un client e un server che si scambiano messaggio tramite socket... Un clico for di 8 messaggi da inviare/ricevere... Riesco a scambiare tre messaggi poi il client mi dice che il socket e' stato chiuso. Perche'? Nel ciclo non tocco mai i socket... Infatti nelle prime tre iterazioni non ci sono problemi.. Vi mostro le parti del codice incriminate:

ho messo i cancelletti dove da' errore "testcli: sendMessage: Transport endpoint is not connected
"

client:
Codice:
for ( i = 0; i<N ; i++ ) {
 
    /* lo invio */
    /* skt e' la connessione su cui mandare il msg */
    if ( sendMessage(sck,&msg) == -1 )  { #####################################
      perror("testcli: sendMessage");
      break;
    }
    fprintf(stdout,"testcli: invio <%c><%d><%s> \n",msg.type,msg.length,msg.buffer);
    /* leggo la risposta */
    if ( receiveMessage(sck,&msg)  == -1) {
      perror("testcli: receiveMessage");
      break;
    }

server:
Codice:
for ( i = 0; i<N ; i++ ) {
    if ( receiveMessage(sk_c,&msg)  == -1) {
     perror("testserv: receiveMssage");
     break;
    }
    /* stampa del messaggio */
    printMessage(&msg);
    
    /* creazione messaggio di risposta */
    msgr.type = MSG_QUERY;
    strcpy(msgr.buffer,"server: ");
    
    if (msg.length > 0) strcat(msgr.buffer,msg.buffer);
    msgr.length = strlen(msgr.buffer) +1;
    
    /* invio messaggio di risposta */
    if ( sendMessage(sk_c,&msgr) == -1 )  {
      perror("testcli: sendMessage");
      break;
    }
  }


questa invece le funzioni di libreria che uso:
Codice:
int receiveMessage(int sc, message_t * msg){
    unsigned int lung;
    
    switch (lung = read(sc,&(msg->type),sizeof(char))){
        case 0: 
            errno = ENOTCONN;
            return -1;
        case -1: 
            return -1;
        default : 
            break;
    }
    lung = 0;
    switch (lung = read(sc,&(msg->length),sizeof(unsigned int))){
        case 0:
            errno = ENOTCONN;
            return -1;
        case -1: 
            return -1;
        default:
            break;
    }
    lung = 0;
    switch (lung = read(sc,msg->buffer,MAXBUF*sizeof(char))){
        case 0: 
            errno = ENOTCONN;
            return -1;
        case -1:
            return -1;
        default: 
            return lung;
    }
}

Codice:
int sendMessage(int sc, message_t *msg){        
    unsigned int n;
    
    
    switch (n = write(sc,msg->buffer,msg->length)){
        case 0:
            errno = ENOTCONN;
            return -1;
        case -1:
            return -1;
        default:
            return n;
    }
    
    return n;
}
 

Entra

oppure Accedi utilizzando

Hot: E3 2021, chi ti è piaciuto di più?

  • Ubisoft

    Voti: 13 15.5%
  • Gearbox

    Voti: 1 1.2%
  • Xbox & Bethesda

    Voti: 59 70.2%
  • Square Enix

    Voti: 3 3.6%
  • Capcom

    Voti: 5 6.0%
  • Nintendo

    Voti: 13 15.5%
  • Altro (Specificare)

    Voti: 6 7.1%

Discussioni Simili