问题标签 [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.
c# - 带有 BeginReceive \ EndReceive 的异步套接字意外数据包
我需要接收异步消息。
在所有消息中,前 2 个字节表示下一个字节数组的长度。我的问题是在少数情况下我会收到意外的数据包。
如果我使用Thread.Sleep(200)
这个问题不会发生,或者很少发生。
我哪里错了?
c# - 在 c# 表单中使用异步客户端套接字发送和接收
我正在尝试连接到远程服务器,登录,然后使用 C# 表单应用程序向它发送数据并从它接收数据。最初我写了一个控制台应用程序,效果很好,但是我需要使用表单。问题是表单应用程序中的我BeginSend
和BeginReceive
方法不起作用。
当我的套接字第一次连接到远程服务器(成功)时,我收到一条来自远程服务器的消息,并且我的ConnectionStatusTest
节目我仍然连接。但似乎在我向它发送数据之前连接就被断开了。来自服务器的原始消息再次显示(而不是我想要接收的新消息),然后显示SendDataException
和ReceiveDataException
消息框,并ConnectionStatusTest
告诉我我不再连接。
这是我的代码:
我花了很多时间试图弄清楚为什么 BeginSend 和 BeginReceive 方法不起作用,我认为我已经将其缩小到以下两件事之一:
在
passText_KeyPress
函数中, 的data
部分string data = loginDetails
不作为参数传递给SendData
函数。因此该SendData
功能无法正常工作并SendDataException
显示 。如果这是问题所在,我如何将loginDetails
(或其他字符串)传递给SendData
函数?使用控制台应用程序连接时,连接、登录或发送或接收数据都没有问题,并且连接不会断开。但是,当我尝试使用 telnet 进行连接时,在大约 30 秒不活动后从服务器返回一条消息,说“与主机的连接丢失”。在我的表单应用程序中,连接似乎也在大约 30 秒后断开,并且由于某种原因,表单应用程序需要大约 25 秒来告诉我我已连接。我曾尝试在表单应用程序中使用 KeepAlive,但显然默认的 TCP KeepAlive 期限为 2 小时。如果这是问题所在,我该如何将其更改为 20 秒?我读过的所有内容都建议让 Visual Studio 通过我的防火墙(我试过这个 - 没有运气),或者必须更改注册表项,
错误消息是“已建立的连接被主机中的软件中止”,错误代码是 10053,这让我觉得我不知何故超时了。我当然可能是错的,问题可能是我没有发现的其他问题。我将衷心感谢您的帮助!谢谢。
更新- 我已经使用同步方法重写了代码(并添加了一个计时器,这样我就可以每 5 秒查看一次是否仍然连接)。我现在得到两个不同的错误。
第一个说“无法立即完成非阻塞套接字操作”并产生错误代码 10035。Receive
当我仍然连接到远程服务器时,该方法会发生此错误。我认为清除缓冲区可能会有所帮助,但这只是意味着我下次尝试阅读它时会收到一条空白消息。所以我只能认为我实际上并没有收到来自服务器的新消息,即使我知道我应该这样做。
第二个是原始错误 - “已建立的连接被主机中的软件中止”,错误代码 10053 -Send
当我在 30 秒后断开连接时发生这种情况。我已经在不同的地方读到更改Socket.Blocking
属性可能会有所帮助,但我已经尝试在调用该方法之前进行它true
,但都没有帮助。false
Receive
关于如何让它发挥作用的任何想法?
修改后的代码:
c# - 使用 BeginReceive 将数据返回到不同类中的另一个方法
我正在使用以下代码在名为UDPComm
. 我所做的是以下内容:
- 我有另一个名为的类
Manager
,它通过 UDP 连接发送消息UPComm.send(byte[])
- 然后它调用
UDPComm.startListening()
来监听消息。
我的问题是,如何将receive()
方法中接收到的字节传递给Manager
类?我试图添加一个回报,但它给了我一个错误udp.BeginReceive(receive, new object())
。
非常感谢您的帮助。
c# - 套接字没有读取所有到达的数据包
我正在使用 C# TCP 客户端并使用 Microsoft 网络监视器监视我的数据包。有一个服务器基本上是一个黑匣子,发送 N 个数据包(现在它的数量级为 10-20),每个数据包与下一个数据包之间的延迟为 0.1 毫秒到 1 毫秒。
我的客户端读取的数据包是有序的,当然大多数到达的数据块比网络监视器上出现的数据块更大,因为 TCP 接收到流。我的问题是一些数据包无法到达(我确实检查了前面的信息块以确保它不存在。它们也没有以错误的顺序存储。)。
那么我的客户是否有可能以某种方式丢失了一些信息?数据包是否发送过于频繁?可悲的是,我无法篡改他们的频率。我在这里添加了一些我的代码,如果你能告诉我为什么没有读取到达的数据包以及如何解决这个问题,我将不胜感激。
这是我第一次调用 BeginReceive 的地方:
这是回调:
这是EstaCompleto()
基本上转换消息并将其添加到列表的方法。(它返回 true 或 false ,因为它实际上是要进入 if 子句,但直到我摆脱这个实际上没有任何用途的问题)
25/3/15 编辑: 这是 MensajeRecibido 课程的其余部分。
c# - 使用异步套接字接收数据
我使用 2 种方法通过连接到 IP 地址的套接字接收数据。
- 同步接收。
- 异步接收。
使用同步接收,我可以在不到 1 秒的时间内从服务器获得所有响应。但是通过使用异步接收,接收所有响应需要 30 多秒。
这是代码:
string - 无法附加到 UDP 侦听器 C# 中接收到的字符串
我有一个创建 UDP 对象的表单,在 UDP 类中创建了一个 UDPClient,并使用 EndReceive 在 BeginReceive 方法中完成接收数据。
当我从 beginreceive 方法中打印接收数据的字符串后,将字节 [] 转换到控制台,并附加文本,只有接收到的数据打印不附加文本。
所以看起来接收到的数据不完整。
打印字符串时,不会显示 NewLine 和附加的“done”。
任何帮助都会很棒!
谢谢
c# - 异步套接字客户端 ReceiveCallback 未执行
您好,我正在使用以下示例代码开发 C# Winforms 应用程序:
https://msdn.microsoft.com/en-us/library/bbx2eya8(v=vs.110).aspx
它连接到正确的 IP 地址和端口号,但在发送字符串命令并等待响应后,应用程序卡住了,因为 ReceiveCallback 没有被执行,因此没有设置 receiveDone ManualResetEvent。我 100% 确定我想收到回复,但应用程序只是卡住并且不执行 ReceiveCallback 方法。没有执行 ReceiveCallback 方法的可能原因是什么?
上下文:该应用程序是直流电动扭矩工具控制器的接口。我连接到控制器的 IP 地址和端口 4545,而不是能够发送开放协议命令来更改设置。
c# - Python Twisted frameowrk transport.write 到 ac# socket BeginReceive 读取基于长度的消息帧值
我正在使用基于长度的消息框架和 python 扭曲框架和运行 BeginRecieve 异步读取的 C# 客户端,我无法获取消息长度的值。
这是扭曲的python代码
self.transport.write(pack(self.structFormat, len(string)) + string)
这是 C# 代码:
int bytesRead = client.EndReceive(ar);
if (bytesRead > 0) { int msg_size = BitConverter.ToInt32(state.buffer, 0);
问题是当我通过 C# 端的 Bitconverter 抓取它时 len(string) 值不正确。该值应为 15,但它的值为 251658240。
任何见解将不胜感激。
garbage-collection - BeginReceive/SocketAsyncEventArgs ArraySegments 列表
传递to /列表背后的原因是什么?ArraySegment<byte>
Socket.BeginReceive
SocketAsyncEventArgs
Socket.BeginReceive
构造函数的 MSDN甚至没有正确描述第一个参数):
参数:
buffers
类型:类型System.Collections.Generic.IList<ArraySegment<Byte>>
数组Byte
,是接收数据的存储位置。
...
我认为主要的想法是在大对象堆上分配一个大缓冲区,然后将这个缓冲区的一部分传递给Socket.BeginReceive
,以避免将小对象钉在堆周围并弄乱 GC 的工作。
但是为什么我要向这些方法传递几个段呢?如果是SocketAsyncEventArgs
,似乎会使这些对象的池化复杂化,我看不出这背后的原因。
c# - .NET 套接字:beginReceive 与带有接收的专用线程
从我读过的内容来看,beginReceive在几乎所有情况下(或全部?)都被认为优于接收。这是因为beginReceive是异步的,它在单独的线程上等待数据到达,从而允许程序在等待的同时完成主线程上的其他任务。
但是使用beginReceive,回调函数仍然在主线程上运行。因此,每次接收到数据时,在工作线程和主线程之间来回切换都会产生开销。我知道开销很小,但为什么不通过简单地使用一个单独的线程来托管一个连续的接收调用循环来避免它呢?
有人可以向我解释一下使用以下风格进行编程的劣势是什么: