c# - 时间:2019-04-10 标签:c#async udp server closes after initiating
问题描述
我是编码新手,尤其是异步编码,并且第一次尝试在 udp 服务器上为我正在开发的游戏(1v1)实现它。在同步 udp 服务器中,当我们接收时代码停止,那么我如何在异步中做同样的事情?目前,控制台通过 GetConnection() 方法并简单地关闭,而不是等待客户端。请帮忙。
// State object for reading client data asynchronously
public class StateObject
{
// Client socket.
public Socket clientSocket = null;
// Size of receive buffer.
public const int BufferSize = 1024;
// Receive buffer.
public byte[] buffer = new byte[BufferSize];
// Received data string.
public StringBuilder sb = new StringBuilder();
}
class UDPServer
{
Socket serverSocket;
IPEndPoint localIPEP;
IPEndPoint senderIPEP;
EndPoint sender;
IPEndPoint[,] playerList;
int playerListIndex;
bool waitingForSecondClient;
public UDPServer(IPEndPoint serverIpEndPoint)
{
localIPEP = serverIpEndPoint;
serverSocket = new Socket(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp);
serverSocket.Bind(localIPEP);
senderIPEP = new IPEndPoint(IPAddress.Any, 0);
sender = senderIPEP;
playerList = new IPEndPoint[5000, 2]; // 5000 possible player lobbies, each with 2 player ip addresses and ports
playerListIndex = 0; // we start filling up the lobbies from 0
Console.WriteLine("Server setup complete.");
}
public void GetConnection()
{
StateObject state = new StateObject();
Console.WriteLine("Waiting for new client.");
serverSocket.BeginReceiveFrom(state.buffer, 0, StateObject.BufferSize, SocketFlags.None,ref sender, ClientConnected, state);
}
public void ClientConnected(IAsyncResult asyncResult)
{
StateObject state = (StateObject)asyncResult;
EndPoint remote = state.clientSocket.LocalEndPoint;
StateObject tempState = new StateObject();
int bytesReceived = serverSocket.EndReceiveFrom(asyncResult, ref remote);
serverSocket.BeginReceiveFrom(tempState.buffer, 0, StateObject.BufferSize, SocketFlags.None, ref remote, ClientConnected, tempState);
Console.WriteLine("-------------");
Console.WriteLine("Received bytes of data: " + bytesReceived);
Console.WriteLine("-------------");
Console.WriteLine("Received string: " + state.sb.ToString());
Console.WriteLine("-------------");
if (state.sb.ToString().Equals("New client"))
{
Send(state.clientSocket, "Hello");
}
}
private void Send(Socket client,string message)
{
EndPoint remote = client.LocalEndPoint;
StateObject state = new StateObject();
// Begin sending the data to the remote device.
serverSocket.BeginSendTo(state.buffer, 0, StateObject.BufferSize, 0,remote,SendCallback,state);
}
private static void SendCallback(IAsyncResult asyncResult)
{
// Retrieve the socket from the state object.
Socket client = (Socket)asyncResult.AsyncState;
// Complete sending the data to the remote device.
int bytesSent = client.EndSendTo(asyncResult);
}
static void Main(string[] args)
{
UDPServer server = new UDPServer(new IPEndPoint(IPAddress.Any, 9050));
server.GetConnection();
}
}
解决方案
这并不能直接解决您的问题,但是您看过System.IO.Pipelines
吗?它的设计正是为了帮助使用 async/await 范式处理异步流。
https://blogs.msdn.microsoft.com/dotnet/2018/07/09/system-io-pipelines-high-performance-io-in-net/
推荐阅读
- c++ - 如何在内核 C 的控制台/视频(受保护)模式下伪造我的操作系统适配屏幕?
- c - 使用 Cython 以 void 指针作为参数包装 C 函数
- python-3.x - 熊猫 iloc 返回空结果
- python - 在 Tkinter 的文本框中保存和重新打开数据
- ansible - 当我运行我的 Ansible-Playbook 时,我希望我的任务名称专门执行
- assembly - 将寄存器设置为 1 的首选方法
- javascript - 如何添加 JavaScript 警报消息以显示使用 JavaScript 的 html 表单验证是正确的
- reactjs - 组件颜色的初始渲染问题
- javascript - Javascript:尽管条件为真,但如果语句未执行,并且要执行的代码在 If 之外工作
- php - MAMP Mysql 似乎已正确安装,但无法正常工作,因为它应该在 Mac OS X 上安装 localhost