- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
嗨堆栈溢出成员。我正在努力处理一些简单的代码,但无法完成。我有这个等待连接的异步服务器。
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/
当然,如果没有数据,BeginReceive() 将永远不会结束。MSDN suggests调用 Close() 会中止 BeginReceive()。 但是,在套接字上调用 Close() 也会对其
我用BeginReceive()方法监听特定的端口。 如何找到发件人的IP? 谢谢你。 最佳答案 我认为您应该详细说明您的问题。 无论如何,您都可以在清晰而详细的"Asynchronous Serve
我有一个用 C# 编写的简单异步套接字服务器(几乎是 Microsoft 的 example ),但是这个示例的问题是它只接受来自客户端的一条消息,然后关闭。我希望此服务器在收到任何消息后保持事件状态
据说 BeginReceive 和 BeginSend 回调不会在 .Net ThreadPool 上执行,而是在 上执行IOCP 线程池。对于高性能服务器,IOCP 线程尽快返回池至关重要,这意味着
基本上我已经建立了套接字连接。这是我的 WaitData 方法: public void WaitForData() { State state = new State
当读取未完成时,读取缓冲区有问题。 如果接收到的 XML 数据是有效的,那么我没有问题。但是,当接收到的 XML 数据不正确时,我正在等待数据的第二部分,然后出现错误。 我的代码如下: int cur
如果客户端通过同一个套接字向服务器发送多条消息,服务器端的 EndReceive 是否会将消息分开,或者服务器是否有可能在单个 BeginReceive 中接收来自两个单独发送的部分消息? 最佳答案
我目前有一个后台线程。在这个线程中是一个无限循环。 这个循环偶尔更新数据库中的一些值,然后在 MessageQueue 上监听 1 秒(使用 queue.Receive(TimeSpan.FromSe
要从套接字异步接收数据,.Net 支持对称的 BeginReceive/EndReceive 调用。基本上你调用BeginReceive()开始监听并确定数据到达时应调用的回调。在回调中调用 EndR
我想做这个 for (int i = 0; i 0 以确定在执行 UdpClient.Receive() 之前是否有任何 UDP 请求排队- 这完全消除了阻塞方面。我确实建议您谨慎尝试此操作,因为此
Socket.BeginReceive/EndReceive 函数的调用顺序是什么? 例如,我两次调用 BeginReceive,一次是为了获取消息长度,第二次是为了获取消息本身。现在的场景是这样的,
在 F# 中使用原始套接字编写异步 Ping,以使用尽可能少的线程启用并行请求。不使用“System.Net.NetworkInformation.Ping”,因为它似乎为每个请求分配一个线程。我也对
我需要接收异步消息。 在所有消息中,前 2 个字节表示下一个字节数组的长度。我的问题是在少数情况下我会收到意外的数据包。 如果我使用 Thread.Sleep(200)这个问题不会发生,或者很少发生。
首先让我说这与 UDP 作为协议(protocol)的可靠性无关。我知道数据包可能会被丢弃、乱序到达等。另外,严格来说,这不是数据速率的问题(我不是试图每秒处理太多的数据包),也不是数据量的问题数据(
我正在使用 UDPClient 发送多播请求并接收来自网络上各种客户端的响应。我能够发送请求并得到响应,但是我得到的响应非常慢。需要 2-3 分钟才能得到所有客户端的响应。在我检查 WireShark
问题: 当我做这样的事情时: for (int i = 0; i < 100; i++) { SendMessage( sometSocket, i.ToString()); Thre
嗨堆栈溢出成员。我正在努力处理一些简单的代码,但无法完成。我有这个等待连接的异步服务器。 while (clientSocket.Connected) { try
我在简单的 Udp 服务器中使用 UdpClient。 是否可以仅从特定的 IP 地址接收 BeginReceive()? 谢谢 最佳答案 没有。这是 UDP 的基础,它不像 TCP 那样是面向连接的
好的,这是我的第一个堆栈溢出问题,所以请随时提出更好的提问方式或我下次应该包括的内容。大多数时候我可以通过谷歌获得答案,但这个有点棘手...... 我正在用 C# 编写一个 Windows 应用程序,
我的 TCP ping/pong 工作正常,但在尝试添加第二种数据类型后,我遇到了接收程序从未触发 BeginReceive 回调的情况。 代码是相同的,除了第二个(有问题的)数据类型,序列化是提前完
我是一名优秀的程序员,十分优秀!