none
Очень прошу помощь с отправкой и принятием сообщений в TcpClient и Socket в C# RRS feed

  • Общие обсуждения

  • Помогите пожалуйста. Я уже не знаю что делать...

    Для проверки входящих соединений использую асинхронную операцию Socket.BeginAccept

    static void Main(string[] args)
            {
                SDatadase SDatadase = new SDatadase();
                AdvancedEncryptionStandard aes = new AdvancedEncryptionStandard();
                SConfig SConfig = new SConfig();
    
                String IPUser = aes.Decrypt(SDatadase.getInfoActivation("userid", "555", "ip"));
                String[] IP = IPUser.Split(new Char[] { ':' });
    
                try
                {
                    IPAddress localAddress = IPAddress.Parse(IP[0]);
                    Socket listenSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                    IPEndPoint ipEndpoint = new IPEndPoint(localAddress, Convert.ToInt16(IP[1]));
                    listenSocket.Bind(ipEndpoint);
    
                    listenSocket.Listen(1);
                    listenSocket.BeginAccept(new AsyncCallback(ReceiveCallback), listenSocket);
                    Console.WriteLine("Ожидание соединения… {0}", listenSocket.LocalEndPoint);
                }
                catch (Exception e)
                {
                    Console.WriteLine("Произошла ошибка: {0}", e.ToString());
                }
     
                Console.ReadKey();
            }
    
            public static void ReceiveCallback(IAsyncResult AsyncCall)
            {
                System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
                Byte[] message = encoding.GetBytes("Я занят");
    
                Socket listener = (Socket)AsyncCall.AsyncState;
                Socket client = listener.EndAccept(AsyncCall);
    
                byte[] bytes = new byte[256];
                int mesage = client.Receive(bytes);
                Console.WriteLine("Получено сообщение: {0}", Encoding.UTF8.GetString(bytes));
    
                Console.WriteLine("Принято соединение от: {0}", client.RemoteEndPoint);
                client.Send(message);
    
                Console.WriteLine("Закрытие соединения");
                client.Close();
    
                // После того как завершили соединение, говорим ОС что мы готовы принять новое
                listener.BeginAccept(new AsyncCallback(ReceiveCallback), listener);
            }

    На первые 5 строк не смотрите, это я получаю IP и порт текущего пользователя...

    как видим, Принять и отправить сообщение можно только в методе 

    ReceiveCallback

    Но я хочу вывести эти два действия (принять и отправить сообщения) в отдельный метод в этом же классе...

    Как мне это сделать что бы не потерять соединение с удаленный сервером...

    19 октября 2015 г. 12:52