Také jsem narazil na stejný problém. Je to proto, že ukončujete připojení k soketu, ale ne k soketu samotnému. Soket může vstoupit do stavu TIME_WAIT (aby se zajistilo, že všechna data byla přenesena, protokol TCP zaručuje doručení, pokud je to možné) a uvolnění může trvat až 4 minuty.
nebo pro OPRAVDU podrobné/technické vysvětlení se podívejte na tento odkaz
Je to jistě nepříjemné, ale není to chyba. Viz komentář od @Vereb k této odpovědi níže o použití SO_REUSEADDR
.
Zkuste netstat takto:netstat -ntp
, bez -l
. Zobrazí připojení tcp vTIME_WAIT
stavu.
Vím, že to už nějakou dobu od té otázky bylo, ale podařilo se mi najít řešení:
int sockfd;
int option = 1;
sockfd = socket(AF_INET, SOCK_STREAM, 0);
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &option, sizeof(option));
Tím nastavíte zásuvku tak, aby ji bylo možné okamžitě znovu použít.
Omlouvám se, pokud je to "špatně". Se zásuvkami nemám moc zkušeností