Hai due possibilità:
- usare socket non bloccanti (ma la sconsiglio perchè poco efficenti per attendere dei dati);
- chiudere il socket una volta terminato l'invio con una shutdown(sock, 2), che chiude la parte di invio della socket prima di fare la close; la read dovrebbe sbloccarsi con un errore (ma non sempre lo fa
) ;
- usare la select
codice:
fd_set socket_set;
FD_ZERO(&socket_set);
struct timeval tv;
FD_SET(sock, &socket_set);
tv.tv_sec = time_out;
tv.tv_usec = 0;
select(sock + 1, NULL, &socket_set, NULL, &tv);
stai attendo perchè la socket è portabile ma ha piccole differenze nei parametri; quello che ho scritto è per linux, per windows al posto di sock + 1 metti 1.
- inviare un byte a zero per indicare al client che il server ha terminato (è la soluzione che preferisco) l'invio, così non stai ad aspettare.
Inoltre invierei e leggerei più bytes alla volta, inviare 1 solo byte è inefficente.