lefantome
09-12-2010, 00:22
Allora ho questo scenario:
-2 programmi: 1 server e 1 client che si scambiano messaggi vari
-Il client ha 2 thread: uno che gestisce l'input da tastiera e invia i messaggi e uno che li riceve e li stampa utilizzando un socket di connessione.
Ora utilizzando uno script bash faccio inviare vari messaggi al server destinati allo stesso client e stampo il risultato su un file (ridirezione output tramite script bash)
Ora testando il server so che i messaggi gli arrivano e li invia, il problema é che abbastanza spesso, eseguendo sempre lo stesso script i messaggi non arrivano o arrivano in maniera parziale, mentri in altri casi tutto ok.
é un problema di fflush? non so come fare. Non penso ci siano race condition nel client.
/**=====================================Thread In=================================== */
void* in(void* arg){
info* inf = (info*)arg;
int* fd = inf->fd;
message_t* msg;
msg = (message_t*)malloc(sizeof(message_t));
while (msg->type != MSG_OK) /* quando riceve MSG_OK significa che aveva inviato un MSG_EXIT al server quindi chiude tutto */
{
/** IF AVAILABLE INPUT? */
if (*inf->av_inputrd == 1)
{
receiveMessage(*fd,msg);
if (msg->length >0){printf ("%s\n",msg->buffer);
free(msg->buffer);}
*inf->av_inputrd =0;
}
}
/** Ripulire ambiente */
free(msg);
/*printf("Thread READER chiuso\n");*/
pthread_exit(0);
}
-2 programmi: 1 server e 1 client che si scambiano messaggi vari
-Il client ha 2 thread: uno che gestisce l'input da tastiera e invia i messaggi e uno che li riceve e li stampa utilizzando un socket di connessione.
Ora utilizzando uno script bash faccio inviare vari messaggi al server destinati allo stesso client e stampo il risultato su un file (ridirezione output tramite script bash)
Ora testando il server so che i messaggi gli arrivano e li invia, il problema é che abbastanza spesso, eseguendo sempre lo stesso script i messaggi non arrivano o arrivano in maniera parziale, mentri in altri casi tutto ok.
é un problema di fflush? non so come fare. Non penso ci siano race condition nel client.
/**=====================================Thread In=================================== */
void* in(void* arg){
info* inf = (info*)arg;
int* fd = inf->fd;
message_t* msg;
msg = (message_t*)malloc(sizeof(message_t));
while (msg->type != MSG_OK) /* quando riceve MSG_OK significa che aveva inviato un MSG_EXIT al server quindi chiude tutto */
{
/** IF AVAILABLE INPUT? */
if (*inf->av_inputrd == 1)
{
receiveMessage(*fd,msg);
if (msg->length >0){printf ("%s\n",msg->buffer);
free(msg->buffer);}
*inf->av_inputrd =0;
}
}
/** Ripulire ambiente */
free(msg);
/*printf("Thread READER chiuso\n");*/
pthread_exit(0);
}