Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何继续在异步套接字上接受数据?_C#_.net_Sockets_Networking_Tcp - Fatal编程技术网

C# 如何继续在异步套接字上接受数据?

C# 如何继续在异步套接字上接受数据?,c#,.net,sockets,networking,tcp,C#,.net,Sockets,Networking,Tcp,因此,我使用C中的Socket类设置了一个非常基本的服务器和一个客户机。 我之前做过一个不异步的,所以我决定试试 我遇到的问题是,我一直从服务器向客户机发送数据,但客户机只收到第一个数据,然后就好像停止了侦听。 有什么方法可以持续检查是否有传入的数据,然后再抓取它 客户 private static Socket _clientSocket; private static byte[] buffer = new byte[2048]; static void M

因此,我使用C中的Socket类设置了一个非常基本的服务器和一个客户机。 我之前做过一个不异步的,所以我决定试试

我遇到的问题是,我一直从服务器向客户机发送数据,但客户机只收到第一个数据,然后就好像停止了侦听。 有什么方法可以持续检查是否有传入的数据,然后再抓取它

客户

private static Socket _clientSocket;
        private static byte[] buffer = new byte[2048];

        static void Main(string[] args)
        {
            Connect();
            Console.ReadLine();
        }

        private static void Connect()
        {
            try
            {
                _clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                _clientSocket.BeginConnect(new IPEndPoint(IPAddress.Loopback, 1234), new AsyncCallback(ConnectCallback), null);
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                throw;
            }
        }

        private static void ConnectCallback(IAsyncResult AR)
        {
            try
            {
                _clientSocket.EndConnect(AR);
                Console.WriteLine("Connected to the server");


                _clientSocket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None,
                    new AsyncCallback(ReceiveCallback), _clientSocket);
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                throw;
            }
        }

        private static void ReceiveCallback(IAsyncResult AR)
        {
            Socket clientSocket = AR.AsyncState as Socket;
            var length = clientSocket.EndReceive(AR);

            byte[] packet = new byte[length];
            Array.Copy(buffer, packet, packet.Length);


            var data = Encoding.ASCII.GetString(packet);
            Console.WriteLine("Received " + data);
        }
服务器呢

private static Socket _clientSocket;
        private static byte[] buffer = new byte[2048];

        static void Main(string[] args)
        {
            Connect();
            Console.ReadLine();
        }

        private static void Connect()
        {
            try
            {
                _clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                _clientSocket.BeginConnect(new IPEndPoint(IPAddress.Loopback, 1234), new AsyncCallback(ConnectCallback), null);
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                throw;
            }
        }

        private static void ConnectCallback(IAsyncResult AR)
        {
            try
            {
                _clientSocket.EndConnect(AR);
                Console.WriteLine("Connected to the server");


                _clientSocket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None,
                    new AsyncCallback(ReceiveCallback), _clientSocket);
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                throw;
            }
        }

        private static void ReceiveCallback(IAsyncResult AR)
        {
            Socket clientSocket = AR.AsyncState as Socket;
            var length = clientSocket.EndReceive(AR);

            byte[] packet = new byte[length];
            Array.Copy(buffer, packet, packet.Length);


            var data = Encoding.ASCII.GetString(packet);
            Console.WriteLine("Received " + data);
        }

在您的ReceiveCallback中,再次调用BeginReceive继续接收。

注意:注意,整个基于EAP事件的异步模式,所有涉及IAsyncResult的内容都已完全过时,您应该使用基于TAP任务的异步模式,所有涉及System.Task*的内容都从.NET 4开始使用