Você pode usar SO_REUSEADDR
int optval = 1;
/* create socket using socket */
setsockopt(s1, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof optval);
/* bind socket */
Você obtém esse erro porque o protocolo TCP força o servidor a colocar o soquete que você acabou de fechar no status TIME_WAIT
pelo tempo definido em net.ipv4.tcp_fin_timeout
. Isso é para garantir que, na verdade, todos os pacotes que o outro peer possa ter enviado após o servidor ter fechado o soquete ainda estejam sendo manipulados corretamente.
Aqui está uma boa descrição desse problema na primeira resposta do tópico: Qual é o significado de SO_REUSEADDR (opção setsockopt) - Linux? .