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:
server:
questa invece le funzioni di libreria che uso:
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;
}