Используйте это в своем сокете перед вызовом listen ():
int on = 1;
setsockopt (sockfd_wan, SOL_SOCKET, SO_REUSEADDR, &on, sizeof (on));
Это позволяет вашей программе использовать этот сокет, даже если он был случайно выбран другим исходящим TCP-соединением (не может происходить для портов <1024). Но это также должно помочь напрямую с вашей проблемой !! </p>
Unrelated:
Есть еще одна плохая вещь, которая может случиться: если ваши дети разветвлены, они наследуют КАЖДЫЙ открытый файловый дескриптор. Если они просто разветвляются и запускают другую долго выполняющуюся программу, они также будут иметь открытый дескриптор вашего прослушивающего сокета, поэтому он остается в использовании (узнайте с помощью команд lsof и netstat!)
Так что нужно назвать это:
int close_on_exec_on(int fd)
{
return fcntl(fd, F_SETFD, FD_CLOEXEC);
}
close_on_exec_on(sockfd);
Но я никогда не пробовал его в основной программе, если он разветвляет childs, и он явно не поможет вам, потому что childs разветвляются, а не запускаются с exec.
Но имейте это в виду и в любом случае вызовите его в свой сокет прослушивания в основной программе! На всякий случай, если вы запускаете внешнюю программу