- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
要从套接字异步接收数据,.Net 支持对称的 BeginReceive/EndReceive 调用。基本上你调用BeginReceive()
开始监听并确定数据到达时应调用的回调。在回调中调用 EndReceive()
提取数据并结束异步读取操作。
我正在编写 C#/.Net 软件来控制一些工业设备。控制面板允许用户设置和初始化设备,一旦初始化 BeginReceive()
被称为开始监听数据。在回调EndReceive()
用于提取数据,但我想立即恢复收听所以我想我应该调用BeginReceive()
在执行 EndReceive()
之后再次.这是正确的吗?
如果是这样,是否有我可以在代码的其他地方使用的检查或测试来了解 BeginReceive()
是否存在?已经被调用所以我不尝试调用 BeginReceive()
在同一 socket 上连续两次,在 EndReceive()
之前被称为?
最佳答案
避免调用 BeginReceive()
的方式在你打电话之前再次EndReceive()
是把电话拨给BeginReceive()
进入你调用 EndReceive()
的完成回调.唯一的电话 BeginReceive()
不应该执行的是,当然,您在 Socket
之后立即执行的那个已连接。
编辑:
明确一点:允许调用BeginReceive()
在任何接收完成发生之前任意次数。但是当你这样做时,你需要确保你做了必要的内务处理,以确保你以正确的顺序处理数据(即你处理缓冲区的顺序与你通过 BeginReceive()
提交它们的顺序相同)。
所以上面的答案是关于不必做所有这些内务处理,从而使代码更简单。
如果您只对 BeginReceive()
进行后续调用在你打电话的地方EndReceive()
,让事情井井有条是微不足道的。请注意,您仍然需要正确执行此操作:确保始终以正确顺序接收缓冲区的最简单方法就是不调用 BeginReceive()
。再次调用直到之后你调用了EndReceive()
(但仍然采用相同的方法)。
关于c# - 正确使用 BeginReceive/EndReceive?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26806332/
我正在尝试使用 Socket.BeginReceive(...) 和 Socket.EndReceive(...) 作为我的 UDP 数据包接收器客户端。它按预期接收和处理数据包,但是,当我希望取消和
我是编程新手,对异步套接字编程感到困惑。 例如,假设我有两个 BeginSend,一个接一个。第一个发送一百万个字符,第二个仅发送 64 个字符。 由于异步性质,第二个 BeginSend 不会在第一
我一直在查看处理来自 MSMQ 的消息的服务的示例代码。在代码中,在 ReceiveCompletedEventHandler 的开头立即调用 EndReceive() 方法,然后它开始实际处理消息的
当以 1024 字节的 block 读取数据时,我如何继续从接收大于 1024 字节的消息的套接字中读取数据,直到没有数据为止?我是否应该只使用 BeginReceive 只读取数据包的长度前缀,然后
我的 TCP 客户端在接收数据时卡住了。 已建立连接 客户端发送 21 个字节。 (见#5) 客户端上的下一个 BeginReceive 调用永远不会调用回调。当我强制它调用 EndReceive 时
关于 microsoft site您可以找到 ReadCallback(IAsyncResult) 的代码 static void ReadCallback(IAsyncResult ar) {
我正在套接字上进行以下 BeginReceive 调用: m_socket.BeginReceive(m_buffer, 0, m_buffer.Length, SocketFlags.Partial
要从套接字异步接收数据,.Net 支持对称的 BeginReceive/EndReceive 调用。基本上你调用BeginReceive()开始监听并确定数据到达时应调用的回调。在回调中调用 EndR
Socket.BeginReceive/EndReceive 函数的调用顺序是什么? 例如,我两次调用 BeginReceive,一次是为了获取消息长度,第二次是为了获取消息本身。现在的场景是这样的,
我需要接收异步消息。 在所有消息中,前 2 个字节表示下一个字节数组的长度。我的问题是在少数情况下我会收到意外的数据包。 如果我使用 Thread.Sleep(200)这个问题不会发生,或者很少发生。
问题: 当我做这样的事情时: for (int i = 0; i < 100; i++) { SendMessage( sometSocket, i.ToString()); Thre
背景: 我正在编写的应用程序使用异步套接字(使用 BeginSend、EndSend、BeginReceive、EndReceive)在彼此之间发送数据。 IPV4 上的套接字是 TCP,没有套接字标
我正在开发一个 C# 程序,我想在其中与 wifi 模块 ( RN 171 ) 交谈。 在我的 Program.cs 中,当我收到 RabbitMQ 消息时,我直接调用我的 Start 方法。 我从
我无法从文档中看出这两者之间的区别: Socket.EndReceive Method (IAsyncResult, SocketError) Socket.EndReceive Method (IA
我在 Windows 服务中使用异步回调来接收网络上的 UDP 数据广播。 回调使用 UDPClient.EndReceive() 方法来结束挂起的异步接收。在服务 OnStop() 方法期间,我 U
我在 SubscriptionClient 上调用 BeginReceive(),如下所示: client.BeginReceive(new TimeSpan(6, 0, 0), new AsyncC
我正在尝试实现包装器类,它将简单地连接到 TCP 服务器并等待数据。一旦数据从服务器提交 - 我将收到此数据并将其传递给我类(class)的订阅者。 这一切都有效。现在我想添加外部功能以在计时器上“重
我在 Windows 服务中使用 MSMQ。 当服务暂停时,我想关闭 MSMQ 并在服务恢复时重新打开它。 代码如下所示: 开始 _mq.ReceiveCompleted += this.Receiv
这与我上一个问题类似。我正在制作一个简单的 tcp/ip 聊天程序,但在使用 EndReceive Callback 函数时遇到了一些困难。我粘贴了 Microsoft 的实现(见下文),我注意到如果
我正在使用 Service Bus 2.1 For Windows Server,并且我有一种异步接收消息的方法。 我的方法的主体是: var waitTimeout = TimeSpan.FromS
我是一名优秀的程序员,十分优秀!