gpt4 book ai didi

带有 beginReceive 的 c# 异步服务器

转载 作者:太空宇宙 更新时间:2023-11-03 18:09:39 25 4
gpt4 key购买 nike

嗨堆栈溢出成员。我正在努力处理一些简单的代码,但无法完成。我有这个等待连接的异步服务器。

while (clientSocket.Connected)
{
try
{
clientSocket.BeginReceive(so.buffer, 0, 200, SocketFlags.None
, new AsyncCallback(wait),so);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}

所以(简称 StateObject)是我的类(class):

internal class StateObject
{
public TcpClient client;
public byte[] buffer;

public StateObject()
{
buffer = new byte[200];
client = new TcpClient();
}
}

我用这个类来输出回调函数的信息。但是我得到 系统缺少足够的缓冲区空间或因为队列已满。我从实际程序中发布了一小段。一个有趣的问题是,如果我写:

while (clientSocket.Connected)
{
try
{
byte[] buffer = new byte[200];
clientSocket.BeginReceive(buffer, 0, 200, SocketFlags.None
, new AsyncCallback(wait),so);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}

它会起作用,但我无法从异步函数中取出缓冲区(等待)。我正在为此苦苦挣扎,找不到答案。

最佳答案

while 循环不应该存在,在endreceive 之后调用beginreceive 即可。

这是一个糟糕的例子,但可能会给你一些想法:

public class AsyncTCP
{

public void StartReceive()
{
byte[] buffer = new byte[200];
clientSocket.BeginReceive(buffer, 0, 200, SocketFlags.None, (state) =>
{
int bytesReceived = clientSocket.EndReceive(state);

// handle buffer.

if(bytesReceived != 0)
StartReceive();
} ,so);
}
}

如果是关于在 EndReceive 处理程序中获取状态:

private void StartReceive()
{
StateObject myState = new StateObject();
myState.buffer = new byte[200];
myState.client = _client; // or whatever

myState.client.BeginReceive(so.buffer, 0, 200, SocketFlags.None, new AsyncCallback(wait),myState);

}

private void EndReceive(IAsyncResult result)
{
StateObject myState = (StateObject)result.State;

int bytesReceived = myState.client.EndReceive(result);

// handle myState.buffer

StartReceive();

}

我认为有更好的方法可以做到这一点,例如:- 只构建一个接收缓冲区。- 放入一些带有长度的包头/数据。

祝你好运

关于带有 beginReceive 的 c# 异步服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18549174/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com