Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Распределённые приложения и сеть > Отлов момента прекращения получения байтов


Автор: albert21 20.5.2006, 15:46
Всем привет!
Как определить, что данные больше не поступают с удалённого хоста (работа с асинхронным сокетом)

//Начинаем получать данные
Код

    public void makeConnections()
    {
        try
        {
            if (null != socket)
            {
                socket.Close();
            }

            IPHostEntry localMachineInfo = Dns.GetHostEntry(Dns.GetHostName());
            IPHostEntry remoteMachineInfo = Dns.GetHostEntry("albertcomp");
            IPEndPoint serverEndpoint = new IPEndPoint(remoteMachineInfo.AddressList[0], 13000);
            IPEndPoint myEndpoint = new IPEndPoint(localMachineInfo.AddressList[0], 0);

            socket = new Socket(myEndpoint.Address.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
            socket.Connect(serverEndpoint);
            socket.BeginReceive(incomingMessage, 0, 256, SocketFlags.None, new AsyncCallback(ReceiveCallback), incomingMessage);
        }
        catch (Exception exception)
        {
            Console.WriteLine(exception.ToString());
        }
    }


Код

    private void ReceiveCallback(IAsyncResult result)
    {
        try
        {
            int num_read = socket.EndReceive(result);
            if (num_read>0)
            {
                bytelist.AddRange((byte[])result.AsyncState);
                socket.BeginReceive(incomingMessage, 0, 256, SocketFlags.None, new AsyncCallback(ReceiveCallback), incomingMessage);
            }
            else
            {
                 [color=orangered]//Сюда вообще не попадаем, почему?[/color]
                socket.Close();
                Console.WriteLine("Server Connection Severed");
            }
        }
        catch (ObjectDisposedException)
        {
            socket.Close();
            Console.WriteLine("Sever Connection Severed");
        }
    }
 

Автор: arilou 22.5.2006, 16:41
Если я не ошибаюсь, в методе ReceiveCallback надо поставить проверку

Код

if(socket.Available > 0)


И если она срабатывает, опять запускать

Код

socket.BeginReceive(incomingMessage, 0, 256, SocketFlags.None, new AsyncCallback(ReceiveCallback), incomingMessage);


Добавлено @ 16:42 
Кстати, надо еще вызывать EndInvoke. Посмотри на CodeProject пример который называется WebDownload (вроде так). 

Автор: albert21 22.5.2006, 18:50
Спасибо, arilou! Всё работает, только я не понял зачем вызывать  EndInvoke и какого объекта этот метод?. Я использовал DataGridView.Invoke, чтобы обратиться к элементу формы не из родного потока этой формы. 

Автор: arilou 23.5.2006, 10:19
albert21,  smile сорри - только сча заметил, что ты вызываешь EndReceive. Именно это я и имел ввиду.  

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)