Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как создать отказоустойчивый сервер? 
V
    Опции темы
HappyLife
Дата 24.7.2007, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



В следствии каких-то манимуляций клиента построенного на ClientSocket'ах мой сервер постороенный на  ServerSocket валиться с ошибкой Asynchronus socket 10053.
Как этого избежать? Как создать сервер, что если возникает ошибка, очистка буфера и все чики-пики?
PM MAIL   Вверх
HappyLife
Дата 24.7.2007, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Вот таким макаром создан сервер

Код


// Как видно, из того что родителем является TThread мой класс  является отдельным потоком.
CSocketsRead::CSocketsRead():
TThread(true),
ServerSocket(new TServerSocket(0))
{
        ServerSocket->ServerType =stNonBlocking;
        ServerSocket->Port = 1988;
}

//---------------------------------------------------------------------------

void __fastcall CSocketsRead::Execute()
{
        if (ServerSocket->Port == 0)
        {
                throw Exception("Не задан порт");
        }
        else
        {
                ServerSocket->Open();
        }
        while(!Terminated)
        {
                ReadFromSockets();
        }
        ServerSocket->Close();
}

//---------------------------------------------------------------------------

void __fastcall CSocketsRead::ReadFromSockets()
{
        for (int i = 0; i <ServerSocket->Socket->ActiveConnections; ++i)
        {
               if (ServerSocket->Socket->Connections[i]->ReceiveLength() >= sizeof(Packet))
               {
                        ReadPacket(ServerSocket->Socket->Connections[i]);
               }
         }
                
}

//----------------------------------------------------------------------------

void __fastcall CSocketsRead::ReadPacket(TCustomWinSocket * Socket)
{
        Packet packet;
        Socket->ReceiveBuf(&packet,sizeof(packet));
}



Это сообщение отредактировал(а) HappyLife - 24.7.2007, 16:26
PM MAIL   Вверх
ksili
Дата 25.7.2007, 07:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

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



Цитата(HappyLife @  24.7.2007,  20:19 Найти цитируемый пост)
если возникает ошибка, очистка буфера и все чики-пики

По-моему ошибки следует обрабатывать:
Код

try
    {
     ....
    }
catch(...)
    {
     ....
    }    

А вообще я в сокетах ни бум-бум, но вот вчера качнул из сети книгу Шнейдера "Эффективное программирование на TCP/IP". На мой взгляд очень толковая книга и в ней наверняка есть ответ на ваш вопрос, т.к. там много материала уделено описанию распространённых проблем и заблуждений, и как сделать то-то и то-то. К тому же код на C++.
Весит книга больше 7 Мб. В формате djvu


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
HappyLife
Дата 25.7.2007, 08:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



ksili, Обрабатывал. Не помогло. Спасибо, за совет.
PM MAIL   Вверх
dumb
Дата 25.7.2007, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

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



Цитата(HappyLife @  24.7.2007,  15:19 Найти цитируемый пост)
валиться с ошибкой Asynchronus socket 10053.

что конкретно из себя представляет этот процесс "вываливания"? окошки какие-то или что?
PM MAIL   Вверх
HappyLife
Дата 25.7.2007, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



dumb, Да окошко Exception. Я только разобраться не могу, где это окошко  ловить надо, и где ставить исключения. И мне кажется, что после появление этого окошко сервер прекращает свою работу. 
PM MAIL   Вверх
HappyLife
Дата 25.7.2007, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Вроде бы сервер продолжать рабоботать после нажатия кнопки OK. Но вот не появления этого окошка мне добиться не удается(
PM MAIL   Вверх
dumb
Дата 25.7.2007, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

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



HappyLife, "повтыкал" чутка в твой код и вопросы теперь имею:

серверсокет делаешь non-block, а читаешь в цикле - странно(либо кода мало дал).
серверсокет создаешь в основном потоке, а работаешь с ним в рабочем - нехорошо.

получается какая штука - так ты создаешь СС в основном потоке, то и окно(невидимое, для WSAAsyncSelect) принадлежит основному - сообщения о сетевых событиях приходят в обработчик этого окошка, и, в случае ошибок, генерится исключение, которое можно отловить в Application->OnException.
по идее, приложение не должно завершаться...

если ты хочешь вынести СС в отдельный поток, то создавай его в Execute и делай цикл выборки сообщений. и обрамляй там что хочешь в try/catch.
PM MAIL   Вверх
HappyLife
Дата 25.7.2007, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(dumb @  25.7.2007,  16:07 Найти цитируемый пост)
делай цикл выборки сообщений

Если ты имеешь ввиду события OnRead и т п. то ими я пользоваться не умею. Меня смущает не понимание того, когда эти событие срабатывают, если данные могут бесконечно поступать на сервер. И я не знаю что мне делать если там будет только половина пакета. Или наоборот будут лишние пакеты, или лишняя половинка пакета.

Цитата(dumb @  25.7.2007,  16:07 Найти цитируемый пост)
если ты хочешь вынести СС в отдельный поток, то создавай его в Execute 

Сделал, все равно не ловит он мои обработки исключений

Код

void __fastcall CSocketsRead::Execute()
{
        try
        {
         ServerSocket = new ServerSocket();
          ServerSocket->Port = Port;
         if (ServerSocket->Port == 0)
        {
                throw Exception("Не задан порт");
        }
        else
        {
                ServerSocket->Open();
        }
        while(!Terminated)
        {
                ReadFromSockets();
        }
        }catch(...)
        {
              ShowMessage("Проблема Игорян((( И фиг знает что делать");

         }
        ServerSocket->Close();
        delete ServerSocket;
}



Как показали испытание, сервер не екается. Если нажать на кнопочку "ок" сработавшего исключение, то все продолжает работать в обычном ритме, пока клиент опять не прервет соединение, тем что брякнется сам по другим каким-то независимым причинам. 


Само приложение не завершается. 

Это сообщение отредактировал(а) HappyLife - 25.7.2007, 16:40
PM MAIL   Вверх
dumb
Дата 25.7.2007, 22:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

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



кинь на форму компонент ApplicationEvents(закладка Additional) - у него в Event'ах есть OnException - туда, скорее всего, твое исключение и приплывет.
PM MAIL   Вверх
HappyLife
Дата 26.7.2007, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



dumb, Благодарю за помощь.
Все оказалось много проще. Методом проб и ошибок у TServerSocket найдено было событье OnClientError которое в качестве параметра принимает ссылку ErrorCode. Я обнуляю эту переменную и сообщение не всплывает.

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


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

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


 




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


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

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