c# - 正确使用 BeginReceive/EndReceive?

标签 c# sockets

要从套接字异步接收数据,.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/

相关文章:

c# - 动态表达式 API - LINQ to SQL

c# - 如何将参数从 Excel 中的 VBA 脚本作为参数传递到外部可执行文件 (C#)?

c# - C# 中的 `params` 是否总是会导致在每次调用时分配一个新数组?

java - 输入流超时

c# - 通常只允许每个套接字地址使用一次...".net remoting

c++ - 非阻塞发送功能

c# - 我的母版页使用我所有其他模型继承的 View 模型,如何简化它?

c# - .net 配置文件 AppSettings : NameValueCollection vs. KeyValueConfigurationCollection

python - 套接字.gaierror : [Errno -2] Name or service not known

c - 发送文件内容到服务器 : Socket