【问题标题】:TCP Client data recieved using event handler使用事件处理程序接收的 TCP 客户端数据
【发布时间】:2023-03-17 19:20:01
【问题描述】:

我正在使用一个 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 event EventHandler<DataRecivedEventArgs> DataRecieved;

但是当我尝试它时,“DataRecivedEventArgs”不是visual studio的认可功能。

有人可以帮我解释一下如何使用 TCPclient 来持续监听数据并在收到一些数据时调用函数吗?

【问题讨论】:

    标签: c# sockets tcp event-handling telnet


    【解决方案1】:

    对于给定的 TCP 连接,接收到的数据在内核中被缓冲到其缓冲区大小限制(这对应用程序是不透明的)。

    当应用程序想要接收数据时,它必须明确告诉内核需要将多少数据复制到应用程序缓冲区,因为缓冲区大小不是无限的,而且内核存储传入有效负载的速度可能比应用程序处理的速度快(不要忘记您的应用程序经常被抢占)。

    您的应用程序从 TCP 套接字接收数据的唯一方法是通过 recv()recvfrom()recvmsg() 系统调用。

    在您的情况下,在用户空间中,您所能做的就是调用与这些系统调用相对应的函数,以便您可以接收数据。交付是按需设计的。此外,应用程序在调用recv()recvfrom()recvmsg()select()poll()epoll() 之前不会知道数据是否到达。

    注意:我不是 C# 人。我知道 C 和内核的内部结构,仅此而已。我只是想指出套接字通信背后的概念。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多