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

3
我正在使用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来持续监听数据并在接收到数据时调用函数吗?
2个回答

1
对于给定的TCP连接,接收到的数据会在内核中缓存,直到其缓冲区大小限制(该限制对应用程序是不透明的)。
当应用程序想要接收数据时,它必须明确告诉内核需要将多少数据复制到应用程序缓冲区中,因为缓冲区大小不是无限的,并且内核可能比您的应用程序处理速度更快地存储传入的负载(不要忘记您的应用程序会被定期抢占)。
您的应用程序从TCP套接字接收数据的唯一方法是通过recv()、recvfrom()、recvmsg()系统调用。
在您的情况下,在用户空间中,您只能调用对应于这些系统调用的函数,以便接收数据。按需交付是按设计实现的。此外,应用程序在调用recv()、recvfrom()、recvmsg()、select()、poll()或epoll()之前不会知道是否已经到达数据。
注意:我不是C#人。我了解C和内核内部,这就是我的全部。我只想指出套接字通信背后的概念。

1

我的回答可能对您来说太晚了。但是由于我最近有同样的需求,现在已经为此发布了一个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;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接