UDP: клиент запущен до сервера - PullRequest
1 голос
/ 12 ноября 2011

В моей игре есть небольшая ошибка: все работает нормально, если сервер запускается раньше клиента, однако когда клиент запускается раньше сервера, они никогда не подключаются.Это все UDP

Проблема возникает, когда клиент пытается вызвать recvfrom () до запуска сервера, когда это происходит, клиент никогда не находит сервер, а сервер никогда не находит клиента.Возникшая ошибка - блок-блокировка.

Если я остановлю клиента с помощью recvfrom и запусту клиент до того, как сервер (клиент все еще отправляет данные, просто не получает их), они оба не находят друг друга без проблем.

Какое решение для этого?Сейчас кажется, что клиент не может вызвать recvfrom без активного сервера, или все это разваливается.Можно ли проверить, находятся ли данные на определенном порте (данные, которые сервер будет отправлять)?Или есть лучший способ сделать это?

Какой-то код ...

Работа сервера - UDPSocket - это класс

    UDPSocket.Initialise();
    UDPSocket.MakeNonBlocking();
    UDPSocket.Bind(LOCALPORT);
    int n = UDPSocket.Receive(&thePacket);
    if (n > 0)
    UDPSocket.Send(&sendPacket);

Клиент ...

    UDP.Initialise();
    UDP.MakeNonBlocking();
    UDP.SetDestinationAddress(SERVERIP, SERVERPORT);

    serverStatus = UDP.Receive(&recvPacket);    
    if (serverStatus > 0)
    {
        //Do some things
        UDP.Send(dPacket);  //Try and reconnect with server
    }

Спасибо

1 Ответ

2 голосов
/ 12 ноября 2011

EWOULDBLOCK не является ошибкой как таковой - это просто означает, что сокет не был блокирующим и не было данных для чтения. Я предполагаю, что ваш сервер прослушивает данные и отвечает через UDP, а клиент отправляет пакет при запуске и получает ответ? Если это так, у вас все равно может быть состояние гонки - что, если сервер работает, но работает немного медленно, и тогда вы получаете EWOULDBLOCK в клиенте? Будет ли ваш клиент просто выйти? Возможно, вы хотите сделать блокировку приема на клиенте, или, может быть, еще лучше, использовать select() или WaitForMultipleEvents() или TCP или что-то еще.

...