问题标签 [beginreceive]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1838 浏览

sockets - 是 Socket.BeginReceive(IList> 缓冲区.. 不是异步的?

我一直在寻找实现一个自定义类:

这将被传递给一个套接字,并用作从该套接字接收数据的缓冲区。

MSDN 文档

在测试时我发现打电话时

开始接收(IList..

挡住了?!当用 BeginReceive(byte[]... 替换它时,它是异步操作的。

有没有其他人遇到过这个?

如果需要,我会发布我的测试代码,但在我丑化这个问题之前,我想听听任何人的意见:)

谢谢!

0 投票
5 回答
60488 浏览

c# - C# Socket.BeginReceive/EndReceive

调用 Socket.BeginReceive/EndReceive 函数的顺序是什么?

例如,我调用BeginReceive两次,一次获取消息长度,第二次获取消息本身。现在的情况是这样的,对于我发送的每条消息,我开始等待它的完成(实际上是对发送的消息的确认,我也在收到确认后等待动作的完成),所以我用每个BeginSend调用BeginReceive,但是在每个BeginReceive的回调,我检查我是否收到长度或消息。如果我正在接收消息并且已经完全接收到它,那么我会调用另一个BeginReceive接收动作的完成。现在这就是事情不同步的地方。因为我的接收回调之一是接收字节,它解释为消息的长度,而实际上它是消息本身。

现在我该如何解决?

编辑:这是一个 C#.NET 问题:)

这是代码,基本上它太大了,抱歉

0 投票
2 回答
6904 浏览

c# - 在异步 HttpWebResponse 读取期间捕获未处理的 SocketException

对 HttpWebRequest.BeginGetResponse/EndGetResponse 和 HttpWebResponse.GetResponseStream().BeginRead/EndRead 的所有异步调用都是从 try/catch 块进行的,但是,这些异常会传播并且不会留下机会来处理它们并停止应用程序终止:

未处理的异常:System.IO.IOException:无法从传输连接读取数据:已建立的连接被主机中的软件中止。---> System.Net.Sockets.SocketException:已建立的连接被主机中的软件中止

未处理的异常:System.IO.IOException:无法从传输连接读取数据:现有连接被远程主机强行关闭。---> System.Net.Sockets.SocketException: 现有连接被远程主机强行关闭

实际代码片段:

PS:在 Microsoft Connect https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=510564提交了错误报告

0 投票
3 回答
869 浏览

c# - 两次 Socket.BeginReceive 调用之间的 TCP 数据包会发生什么情况?

我对套接字编程有疑问。我正在开发一个 TCP 数据包嗅探器。我正在使用 Socket.BeginAccept、Socket.BeginReceive 来捕获每个数据包,但是当收到数据包时,我必须处理一些事情。这是一个快速操作,但需要几毫秒,然后再次调用 BeginReceive。

我的问题是,如果在我处理过程中发送了一些数据包并且没有调用 BeginReceive,会发生什么?数据包丢失了,还是内部缓冲了?有限制吗?

0 投票
2 回答
12018 浏览

asynchronous - BeginReceive / BeginRead 超时

我正在使用 NetworkStream 和 TcpClient 使用 BeginRead 异步接收数据。我需要对此操作应用超时,这样在指定的时间后读取将被中止。

据我所知,NetworkStream 或 TcpClient 不支持此功能-有一个 ReceiveTimeout 属性,但这似乎仅适用于同步等效项-“读取”。

甚至底层的 Socket 类似乎也不支持其 BeginReceive 方法中的超时。

我已经搜索过这个问题,我看到的唯一建议的解决方案是设置另一个后台线程来取消操作,如果它没有在超时期限内完成。这似乎是一个可怕的黑客攻击。肯定有更好的方法吗?

0 投票
5 回答
25286 浏览

c# - 如何在循环中使用 UdpClient.BeginReceive

我想做这个

UdpClient.Receive我必须使用 ,而不是使用UdpClient.BeginReceive。问题是,我该怎么做?使用BeginReceive的示例并不多,而且 MSDN 示例根本没有帮助。我应该使用BeginReceive,还是只在单独的线程下创建它?

我一直得到ObjectDisposedException例外。我只收到发送的第一个数据。下一个数据将抛出异常。

是什么赋予了?

顺便说一下,总体思路是:

  1. 创建 tcpclient 管理器。
  2. 使用 udpclient 开始发送/接收数据。
  3. 当所有数据都发送完毕后,tcpclient 管理器将向接收者发出所有数据已发送的信号,并且应该关闭 udpclient 连接。
0 投票
3 回答
7271 浏览

c# - .NET 异步 MSMQ

我不明白这是哪里出了问题。基本上,我有一个从消息队列接收并处理消息的程序。程序可以随时停止,在这种情况下,消息循环在程序退出之前完成了它正在执行的操作。我正在尝试使用以下代码来完成此操作:

正如希望显而易见的那样,Stop 方法处理消息队列,然后等待设置空闲等待句柄(这应该发生,因为在处理时将调用 ReceiveCompleted 事件,但 e.Message 属性应该除外)。

但是,消息循环仍在继续!我已经处理了消息队列,但它仍然设法从中读取,并且未调用异常处理程序,这意味着 idle.Wait 行将永远等待。

我的理解是,处理消息队列应该结束任何挂起的接收并调用事件,但 e.Message(或 q.EndReceive)应该抛出异常。不是这样吗?如果没有,我还能如何安全地退出我的消息循环?

谢谢

更新:

这是一个完整的例子(假设队列存在)

0 投票
1 回答
759 浏览

c# - WebClient.Upload 和 Socket.BeginReceive 的问题

我目前正在编写一个简单的 Web 服务器和一些客户端来使用它。我的客户希望能够扩展即将推出的解决方案的功能以包括 Web 客户端,但我们需要对通信进行细微控制,因此一个简单的 Web 服务器就是解决方案。

无论如何,有两个症状,我可以通过运行一堆单元测试来 100% 地重现它们。当我使用“POST”命令将一个简单的字符串上传到服务器时,问题就出现了。这不是我在现实中会做的事情,但我无法继续前进,不了解正在发生的事情。我有一个单元测试,它使用 BinaryFomatter 简单地序列化字符串“Hello World!”。我在结果字节数组数据前加上一个整数,表示流数据的长度。肯定是一个非常简单的协议,但它在所有其他情况下都可以正常工作(主要是大型对象图)。我有两种情况:

  1. 上传一个非常短的字符串(“Hello World!”)
  2. 上传一个大字符串(几千个字符)。

当我在没有先运行任何其他单元测试的情况下运行该单元测试时,这会按预期工作,但是每当我运行所有单元测试时,这个单元测试总是以两种不同的方式失败:

  1. 短字符串似乎不会触发接收套接字来接收它。更具体地说,当我调用 Socket.BeginReceive() 时,我的回调永远不会被调用。
  2. 长字符串确实按预期触发接收,但流被损坏。长度前缀(4 字节,序列化 Int32)包含一个非常大的值。当然不是正确的。

这是服务器代码中有趣的部分:

我可能在这里得出错误的结论,但我没有看到流对象图有任何问题,而对序列化字符串做同样的事情是有问题的。我不明白为什么。我将不胜感激任何可以为我指明正确方向的提示。

编辑

看来问题是由以前的测试用例引起的,与发送字符串无关,这是我的第一个怀疑。有没有办法让数据在两次连续上传之间“徘徊”?但是,每次上传都会重新创建客户端套接字。

这是上传的客户端:

干杯

/乔纳斯

0 投票
1 回答
814 浏览

c# - MessageQueue BeginReceive() 方法调用了两次

如果我调用该BeginReceive()方法两次(一个接一个)会发生什么?

例子:

请帮忙

谢谢 :D

0 投票
2 回答
1529 浏览

c# - IOCP线程与线程池处理消息

当您使用 BeginReceive/EndReceive 处理套接字 IO 时,回调由 IOCP 线程调用。

完成接收后,您需要处理数据。

  • 你应该在回调的调用线程上做吗?
  • 或者您应该使用 ThreadPool.QueueUserWorkItem 运行任务

通常样本在回调线程上完成工作,这有点令人困惑。

如果您正在处理数百个活动连接,则在 IOCP 线程上运行处理最终会得到一个具有数百个线程的进程。ThreadPool 是否有助于限制并发线程的数量?