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.