使用事件处理程序接收的TCPClient数据

时间:2014-03-18 22:49:00

标签: 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 event EventHandler<DataRecivedEventArgs> DataRecieved;

然而,当我尝试它时,“DataRecivedEventArgs”不是visual studio的公认功能。

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

1 个答案:

答案 0 :(得分:1)

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

当应用程序想要接收数据时,必须明确告诉内核需要将多少数据复制到应用程序缓冲区,因为缓冲区大小不是无限的,并且内核可能比应用程序可以处理的更快地存储传入的有效负载(不要忘记你的申请会被定期抢占)。

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

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

注意:我不是C#人。我知道C和Kernel的内部结构,而且非常重要。我只是想指出套接字通信背后的概念。