c# - 使用事件处理程序接收到的 TCP 客户端数据

标签 c# sockets tcp event-handling telnet

我正在使用 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/

相关文章:

c# - 如何对 URL 字符串进行编码

c++ - close() 和 close socket() 可以互换吗?

iphone - 是否可以通过互联网在两个移动设备(iPhone)之间连接一个套接字?

c# - 端口检查工具导致 TcpClient 服务器上的无限数据包接收循环

c# - 如何使用 linq 和 c# 根据列中行之间的差异进行分组?

c# - Razor 模板中的可空日期时间错误

c# - 如何使用 get set 从继承的属性中删除 set 访问器

python socket.recv/sendall 调用阻塞

java - 在 3G 上闪存到 Java 套接字丢失数据包

tcp - 通过以太网发送的纯 TCP Ack 的总长度是多少?