UDP:客户端在Server之前启动

时间:2011-11-12 17:07:20

标签: c++ visual-studio networking udp

我刚刚在游戏中遇到了一些小故障,如果服务器在客户端之前启动,那么一切运行正常但是当客户端在他们从未连接的服务器之前启动时。这都是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 个答案:

答案 0 :(得分:2)

EWOULDBLOCK本身不是错误 - 它只是意味着套接字是非阻塞的,并且没有数据可读。我假设您的服务器通过UDP侦听数据和回复,并且客户端在启动并收到回复时发送数据包?如果是这样,你可能会遇到竞争条件 - 如果服务器正在运行但速度有点慢,那么你在客户端获得EWOULDBLOCK呢?你的客户会退出吗?也许你想在客户端进行阻塞接收,或者更好的是,使用select()WaitForMultipleEvents()或TCP或其他东西。