- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在套接字上进行以下 BeginReceive 调用:
m_socket.BeginReceive(m_buffer, 0, m_buffer.Length, SocketFlags.Partial, this.ReceiveCallback, null);
在我的类(class)中调用 ReceiveCallback
函数
try {
int bytesReadFromSocket = m_socket.EndReceive(ar);
if(bytesReadFromSocket > 0) {
// Do some processing
}
}
finally {
if(m_socket.Connected) m_socket.BeginReceive(m_buffer, 0, m_buffer.Length, SocketFlags.Partial, this.ReceiveCallback, null);
}
我遇到的问题是 EndReceive 返回零,但 m_socket.Connected 返回真,所以我再次调用 BeginReceive。这发生在一个永远不会停止的紧密循环中。当 EndReceive 返回零时,文档中并不清楚。我假设它只在套接字关闭时发生,但这似乎不是真的。
那么问题来了,EndReceive在什么情况下可以返回0?
最佳答案
Socket.EndReceive()
在一种特定情况下返回 0:远程主机已开始或确认正常关闭序列(例如,对于基于 .NET Socket
的程序,使用 SocketShutdown.Send
或 SocketShutdown.Both
调用 Socket.Shutdown()
。
但是请注意,从技术上讲,直到套接字最终关闭,它才处于“连接”状态。
您不应使用 Connected
属性来确定是否从套接字发出另一次读取。相反,由于 0 的返回值是专门保留的,表示不会发送更多数据,因此您只需检查 EndReceive()
的返回值并调用 BeginReceive()
如果值为正数(即不为零),则再次返回。
关于c# - 如果套接字仍处于连接状态,EndReceive 是否应该返回零?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26740823/
我正在尝试使用 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
我是一名优秀的程序员,十分优秀!