C# 每秒接收一个数据包的TCP套接字
我试图编写一个基本的游戏,当一个玩家移动时,另一个玩家收到数据包,反之亦然。问题是,仅每秒接收一个数据包。我知道这不是连接,因为它始终是相同的丢失数据包模式 我的代码如下:C# 每秒接收一个数据包的TCP套接字,c#,sockets,.net-4.0,tcp,C#,Sockets,.net 4.0,Tcp,我试图编写一个基本的游戏,当一个玩家移动时,另一个玩家收到数据包,反之亦然。问题是,仅每秒接收一个数据包。我知道这不是连接,因为它始终是相同的丢失数据包模式 我的代码如下: Socket serverSocket private void Window_Loaded(object sender, RoutedEventArgs e) { //Take socket from another window that created it and start receiving s
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());
}
你知道为什么在我的情况下或者其他情况下会发生这种情况吗?谢谢 我能立即看到的是,您没有调用
EndReceive
,这意味着您没有处理该方法的关键返回值:接收的字节数。我希望您的数据被合并,并且在一个“接收”呼叫中接收多条消息(TCP是基于流的,而不是基于消息的)
这也意味着你没有看到任何你应该知道的异常
此外,不调用
End*
方法可能会导致泄漏问题-您很想调用End*
方法。或者切换到较新的异步IO API。发生的事情是,我对BeginRecieve有两个不同的异步回调,一个来自创建套接字的原始窗口(“欢迎”),另一个用于此窗口。每次另一台计算机发送消息时,接收数据的异步回调在这两台计算机之间交替进行
这个故事的寓意是:一个套接字只有一个AsyncCallback,除非您只想每秒接收一个数据包。啊,很抱歉,在简化问题中的代码时,我无意中删掉了EndReceive。然而,我已经找到了答案。。。