Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> закрытие сокета, асинхронные сокеты 
:(
    Опции темы
Grambler
Дата 27.5.2007, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 22.12.2006

Репутация: нет
Всего: нет



исполльзую асинхронные сокеты
Код

 private void Receive()
        {
            try
            {
                 state.client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
                    new AsyncCallback(ReceiveCallback), state);
            }
            catch (Exception e)
            {
                ErrorDisconnect(e);
            }
        }

private void ReceiveCallback(IAsyncResult ar)
        {
            try
            {
                StateObject state = (StateObject)ar.AsyncState;
                Socket client = state.client;
                int bytesRead = client.EndReceive(ar);
                if (bytesRead > 0)
                    state.sb.Append(Encoding.ASCII.GetString(state.buffer, 0, bytesRead));
                int endcmd = state.sb.ToString().IndexOf(">"); // получена команда
                if (endcmd > 0)
                {
                    // обработка полученных данных
                    // ...
                    // продолжить прием
                    client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReceiveCallback), state);
                }
                else
                {                    
                    client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
                        new AsyncCallback(ReceiveCallback), state);
                }
            }
            catch (Exception e)
            {
                ErrorDisconnect(e); // закрываем сокет
            }
        }


при закрытии сокета на другой стороне 
в методе ReceiveCallback bytesRead == 0 и происходит зацикливание метода из-за вызова
Код

client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
                        new AsyncCallback(ReceiveCallback), state);

является ли условие bytesRead == 0 достаточным для определения закрытия сокета на другой стороне ?
по идеи код надо перписать так

Код

private void ReceiveCallback(IAsyncResult ar)
        {
            try
            {
                StateObject state = (StateObject)ar.AsyncState;
                Socket client = state.client;
                int bytesRead = client.EndReceive(ar);
                if (bytesRead > 0)
                {
                    state.sb.Append(Encoding.ASCII.GetString(state.buffer, 0, bytesRead));
                    int endcmd = state.sb.ToString().IndexOf(">"); // получена команда
                    if (endcmd > 0)
                    {
                        // обработка полученных данных
                        // ...                        
                    }
                    // продолжить прием
                    client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReceiveCallback), state);
                }
                else
                {
                    // сокет на другой стороне закрыт
                    // или закрываем сокет
                    client.Shutdown(SocketShutdown.Both);
                    client.Close();
                    // или ничего не делаем
                }
            }
            catch (Exception e)
            {
                ErrorDisconnect(e); // закрываем сокет
            }
        }

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
cully
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, cully, mr.DUDA, Exception.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Распределённые приложения и сеть | Следующая тема »


 




[ Время генерации скрипта: 0.0396 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.