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

本文关键字:TCP 客户端 数据 事件处理 程序 | 更新日期: 2023-09-27 17:50:48

我正在使用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提供了一个使用公共事件的例子

public event EventHandler<DataRecivedEventArgs> DataRecieved;

然而,当我尝试它时,"DataRecivedEventArgs"不是visual studio的识别功能。

有人可以帮助解释给我如何使用TCPclient一致地侦听数据,并在接收到一些数据时调用函数?

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

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

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

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

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

注意:我不是c#的人。我知道C语言和内核的内部结构,差不多就这些了。我只是想指出套接字通信背后的概念

我的回答对你来说可能太晚了。但是由于我最近有同样的需求,我现在已经发布了一个nuget包。它提供了一个在传入数据上触发的事件。所以你只需要订阅它。

PM> install-package Nager.TcpClient
https://github.com/nager/Nager.TcpClient

void OnDataReceived(byte[] receivedData)
{
}
using var cancellationTokenSource = new CancellationTokenSource(1000);
using var tcpClient = new TcpClient();
tcpClient.DataReceived += OnDataReceived;
await tcpClient.ConnectAsync("tcpbin.com", 4242, cancellationTokenSource.Token);
await tcpClient.SendAsync(new byte[] { 0x01, 0x0A });
await Task.Delay(400);
tcpClient.Disconnect();
tcpClient.DataReceived -= OnDataReceived;