bind () с SO_REUSEADDR не работает

Моя задача - реализовать игру для двух игроков между двумя компьютерами, подключенными через TCP. Одно из требований состоит в том, что только победителю предоставляется выбор снова играть или нет. В случае, если сервер выигрывает и решает не играть дальше, клиент должен перезапуститься как сервер и принять новые соединения.

Мой подход: Если игра ПРОИГРЫВАЕТСЯ (в клиентском режиме), закройте sockfd и создайте еще одну. Затем используйте setsockopt, чтобы разрешить повторную привязку с использованием SO_REUSEADDR, а затем вызовите bind.

int yes = 1;
if ( setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) == -1 )
{
    perror("setsockopt");
}

if ( bind(sockfd, (struct sockaddr*)&svr, sizeof(svr) ) == -1 )
{
    perror("server: bind");
}

Но я все равно получаю ту же ошибку «Адрес уже используется». Я пробовал спать на 150 секунд, прежде чем воссоздать сокет, и этот метод работает.

ПРИМЕЧАНИЕ. Я тестирую это на том же ПК. Он может работать на двух связанных компьютерах, но необходимо, чтобы он работал на одном компьютере. Пожалуйста помоги.

6
задан tecfreak 30 November 2011 в 18:24
поделиться