2011-11-12 18 views
1

私のゲームでちょっとした不具合がありました。サーバーがクライアントよりも前に起動されていても、これはすべてUDPですUDP:サーバーの前にクライアントが起動しました

この問題は、クライアントがサーバーを検出する前にrecvfrom()を呼び出そうとしたときに発生し、クライアントがサーバーを見つけられず、サーバーがクライアントを見つけられない場合に発生します。結果として生じるエラーは、偽造品です。

私はrecvfromを使用してクライアントを停止し、サーバーの前でクライアントを開始すると(クライアントは依然として受信していないデータを送信しています)、どちらも問題はありません。

解決策は何ですか?今のところ、クライアントはサーバーがアクティブでなくてもrecvfromを呼び出すことができない、またはすべてが崩壊することがあります。データが特定のポート(サーバーが送信するデータ)に座っているかどうかを確認するためのチェックはありますか?それとももっと良い方法がありますか?

いくつかのコード...

サーバーの操作 - UDPSocketはクラス

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

クライアントです...

答えて

2

EWOULDBLOCKは、それ自体はエラーではありません

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 
    } 

感謝これは、ソケットが非ブロッキングであり、読み取るデータがないことを意味します。私はあなたのサーバーがUDPを介してデータと応答を待ち受けると仮定し、クライアントは応答を開始して受信するとパケットを送信していますか?もしそうなら、とにかく競合状態になる可能性があります。サーバが稼働していても少し遅い場合、クライアントでEWOULDBLOCKを取得するとどうなりますか?あなたのクライアントはちょうど終了しますか?おそらく、あなたはクライアントでブロック受信をしたいと思うかもしれませんが、おそらくもっと良い方法は、select()またはWaitForMultipleEvents()またはTCPか何か他のものを使うことです。

+0

クライアントとサーバは、クライアントがサーバよりも前に開かれている場合にのみ、これが壊れていると言われるように、特定のポート(クライアントは現時点ではローカルIPに接続しています)なぜサーバーやクライアントがデータを受け取ることがないのか理解できません。 – Chris

+0

擬似コードまたは実際の「壊れた」コードが多少あります。あなたの2つのプログラムがどのように相互作用するかはまだ完全には明らかではない。 –

+0

うまくいけばそれは意味がある – Chris

関連する問題