我正在使用 TCP 客户端学习如何在 VS2010 C# 中使用 TCPSocket 函数。我可以调用 read() 函数来读取数据。那部分都有效。我不明白的是如何设置客户端以收听流并将传入数据发布到文本框,而无需手动调用函数或使用计时器。我想用事件处理程序来处理这个问题,但在这一点上我完全弄糊涂了,现在我需要一些指导。
我正在使用在 MSDN 上找到的客户端示例来帮助我了解该函数如何进行基本阅读。
private static void Receive(Socket client) {
try {
// Create the state object.
StateObject state = new StateObject();
state.workSocket = client;
// Begin receiving the data from the remote device.
client.BeginReceive( state.buffer, 0, StateObject.BufferSize, 0,
new AsyncCallback(ReceiveCallback), state);
} catch (Exception e) {
Console.WriteLine(e.ToString());
}
}
在另一篇 stackoverflow 帖子中,我发现 Matt Davis 提供了一个 example使用公共(public)事件
public event EventHandler<DataRecivedEventArgs> DataRecieved;
然而,当我尝试它时,“DataRecivedEventArgs”不是 visual studio 可识别的函数。
谁能帮我解释一下如何使用 TCPclient 持续监听数据并在收到某些数据时调用函数?
最佳答案
对于给定的 TCP 连接,接收到的数据在内核中缓冲到其缓冲区大小限制(这对应用程序是不透明的)。
当应用程序想要接收数据时,它必须明确地告诉内核需要将多少数据复制到应用程序缓冲区,因为缓冲区大小不是无限的,而且内核存储传入有效负载的速度可能比应用程序处理的速度更快(不要忘记您的应用程序经常被抢占)。
应用程序从 TCP 套接字接收数据的唯一方法是通过 recv()
、recvfrom()
、recvmsg()
系统调用。
在您的情况下,在用户空间中,您所能做的就是调用与这些系统调用相对应的函数,以便您可以接收数据。交付是按需设计的。此外,应用程序在调用 recv()
、recvfrom()
、recvmsg()
、select()
、poll()
或 epoll()
。
注意:我不是 C# 人。我知道 C 和内核的内部结构,仅此而已。我只是想指出套接字通信背后的概念。
关于c# - 使用事件处理程序接收到的 TCP 客户端数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22492694/