Regole del forum
1) Rispettare le idee altrui.
2) Evitare le offese dirette.
3) Leggere attentamente le risposte ricevute
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.
La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
non conosco il numero di stringhe che saranno inviate, e dopo aver ricevuto l'ultima mi si blocca il programma. In pratica recv() continua ad aspettare altri dati, solo che non arriveranno mai
E' possibile mettere un timeout alla funzione ?
Sicuro che non ottiene un SIGSEGV quando manipoli il buffer? Per analizzare ciò che avviene prova strace o meglio ancora gdb. Oppure allega (o linka se è lungo) l'intero programma e gli diamo un'occhiata.
EDIT: ad ogni modo, sembra che tu debba controllare un solo file descriptor, in questo caso, IMO, è più logico usare poll...
Si infatti, avevo fatto un po' di casino con i puntatori
Ho continuato ad usare la select() perchè ho trovato poca documentazione riguardo la poll()...Certo che queste funzioni sono alquanto criptiche (o sono io negato ?)
/* ... */
#include <poll.h>
TcpData* tcp_recv(int fd)
{
/* ... */
struct pollfd pfd; /* struttura per UN fd da monitorare */
pfd.fd = fd; /* assegno il file descriptor del socket */
pfd.events = POLLIN; /* mi aspetto eventi in entrata */
for (;;) {
/* primo argomento: puntatore alle strutture da monitorare, in questo caso è una sola
* secondo: numero di strutture
* terzo: timeout in msec
*/
int res = poll(&pfd, 1, TIMEOUT);
if (!res) {
/* time out */
}
else if (res < 0) {
/* errore */
}
else {
/* lettura del socket */
}
}
return data;
}