Я думаю, что разумный способ реализовать это - использовать select (3) с таймаутом.
Вот один пример:
https://smnd.sk/anino/programming/c/unix_examples/poll.html
Вы не просто используете recv, но используете select () с параметром timeout.
fd_set rfd;
FD_ZERO(&rfd);
// sock is your socket
FD_SET(sock, &rfd);
while (1)
{
timeval tv = { 1/*seconds*/, 0 /*ms*/ };
int result = select(sock+1, &rfd, 0, 0, &tv);
if (result == EINTR)
{
// timeout, send stuff and close(sock)
}
else if (result > 0)
{
if (!FD_ISSET(sock, &rfd))
{
recv(sock, ..);
}
}
}