0

我正在尝试编写一个基本游戏,当一个玩家移动时,另一个玩家会收到数据包,反之亦然。问题是,只有每一个第二个数据包被接收。我知道这不是连接,因为它始终是相同的丢失数据包模式。

我的代码如下:

Socket serverSocket

private void Window_Loaded(object sender, RoutedEventArgs e)
{
    //Take socket from another window that created it and start receiving
    serverSocket = Welcome.MainSocket;
    serverSocket.BeginReceive(Buffer, 0, Buffer.Length, SocketFlags.None, new AsyncCallback(OnReceive), null);

    //The initial definition of the socket was this (in the Welcome window)
    //MainSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    //MainSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
    //MainSocket.Bind(new IPEndPoint(OwnLocal, OwnPort));
    //MainSocket.Connect(Address, OppositePort);
}

private void OnReceive(IAsyncResult ar)
{
    OnlineData Data = OnlineData.FromByte(Buffer);

    //Do stuff with data on UI thread
    if (Data is MoveData)
    {   App.Current.Dispatcher.Invoke((Action)delegate
            {
                ((MoveData)Data).Sync(Game, Me == Game.PlayerOne ? 1 : 2);
            });
    }

    //End receive and start receiving again
    serverSocket.EndReceive(ar);
    serverSocket.BeginReceive(Buffer, 0, Buffer.Length, SocketFlags.None, new AsyncCallback(OnReceive), null);
}

//Called each time the player makes a move
void SocketSend(OnlineData Data)
{
    serverSocket.Send(Data.ToByte());
}

任何想法为什么会在我的情况或任何其他情况下发生这种情况?谢谢!

4

2 回答 2

2

我可以立即看到的是您没有调用EndReceive,这意味着您没有处理该方法的关键返回值:接收到的字节数。我希望您的数据正在合并,并且在单个“接收”调用中接收到多条消息(TCP 是基于流的,而不是基于消息的)。

这也意味着您没有看到任何您应该知道的异常。

此外,不调用End*方法可能会导致泄漏问题 - 您非常想调用End*方法。或者切换到更新的异步 IO API。

于 2013-11-13T16:04:14.360 回答
0

发生的事情是我有两个不同的 AsyncCallbacks 用于 BeginRecieve,一个来自创建套接字的原始窗口(“欢迎”),一个用于此窗口。每次另一台计算机发送消息时,接收数据的 AsyncCallback 在两者之间交替

这个故事的寓意:只有一个 AsyncCallback 用于套接字,除非您只想接收每秒一个数据包。

于 2013-11-14T01:30:07.980 回答