Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.02.2008, 20:15   #1
GHOST_Kasper
Пользователь
 
Аватар для GHOST_Kasper
 
Регистрация: 19.11.2007
Сообщений: 15
Вопрос Обработка исключительной ситуации (сокеты)

Запускаем серв и несколько клиентов. При убивании процесса клиента или выдергиваем кабель с его же машины, то на сервере вылазит ошибка асинхронной передачи. Из списка клиентов на сервере, вырубленный клиент остается активным, как будто он в сети. При отправке ему сообщения со второго клиента, серв падает замертво с ошибкой: буфер оверфлоу. Подскажите пожалуйста, как отловить отключение клиента?
(при стандартном закрытии клиента все нормально обрабатываю)
GHOST_Kasper вне форума Ответить с цитированием
Старый 11.02.2008, 20:39   #2
Квэнди
Старожил
 
Аватар для Квэнди
 
Регистрация: 13.12.2006
Сообщений: 3,859
По умолчанию

посылать регулярно служебные пакеты-аки
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи
Квэнди вне форума Ответить с цитированием
Старый 11.02.2008, 20:59   #3
GHOST_Kasper
Пользователь
 
Аватар для GHOST_Kasper
 
Регистрация: 19.11.2007
Сообщений: 15
По умолчанию

а если клиентов под тысячу будет? он тока аки замучается посылать
может как нибудь try .. excerpt это проверить при посылке сообщения?
я с try .. excerpt ниразу не работал незнаю как их использовать...
Код:
  procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
    Socket: TCustomWinSocket);
   var s: string;
       i: Integer;
  begin
    {сохраняем в s присланную нам строку}
    s := Socket.ReceiveText;
    Memo1.Lines.Insert(0, s); {просмотр всех пакетов...}
    {Если кто-то прислал нам свое имя}
    if Copy(s,1,2) = '#N' then begin
     Delete(s,1,2);
     {Добавляем его в юзер лист}
     UserList.Items.Add(s);
     {Записываем в s команду для посылки нового списка юзеров}
     s := '#U';
     for i := 0 to UserList.Items.Count-1 do
      s := s+UserList.Items[i]+';';
     {...и рассылаем этот список всем клиентам}
     for i := 0 to ServerSocket1.Socket.ActiveConnections-1 do
      ServerSocket1.Socket.Connections[i].SendText(s);
     Exit;
    end;
    {Если кто-то кинул сообщение - рассылаем его всем клиентам}
    if (Copy(s,1,2) = '#M')or(Copy(s,1,2) = '#P') or (Copy(s,1,2) = '#L') then begin
     for i := 0 to ServerSocket1.Socket.ActiveConnections-1 do
      ServerSocket1.Socket.Connections[i].SendText(s);
     Exit;
    end;
  end;   
  
  procedure TForm1.ServerSocket1ClientDisconnect(Sender: TObject;
    Socket: TCustomWinSocket);
   var i: Integer;
  begin
    {Кто-то присоединился или отсоединился.
				 Запрашиваем у всех юзеров их имена}
    UserList.Items.Clear;
    for i := 0 to ServerSocket1.Socket.ActiveConnections-1 do
     ServerSocket1.Socket.Connections[i].SendText('#N');
  end;
вот код где эту ошибку вылавливать?
GHOST_Kasper вне форума Ответить с цитированием
Старый 11.02.2008, 21:07   #4
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Если тысячу и больше... то я бы забыл про какой то компонент использовал бы чистый WinSock а Квэнди прав, все "нормальные" серверы поддерживают именно такой способ проверки... Высокоуровневый подход к задаче построения сервера, если там будет столько людей, мне кажется бессмысленным.
BOBAH13 вне форума Ответить с цитированием
Старый 11.02.2008, 21:18   #5
GHOST_Kasper
Пользователь
 
Аватар для GHOST_Kasper
 
Регистрация: 19.11.2007
Сообщений: 15
По умолчанию

не подскажете нормальные статьи или книги (где скачать можно) про WinSock... Извиняюсь за глупые вопросы, в сетевое програмирование недавно залез...

вот нашел исходники чата с компонентами WinSock 2.0 это на нем писать? Надеюсь исходники помогут кому нибудь в сетевом программировании...
Вложения
Тип файла: rar UniChat_2src.rar (468.5 Кб, 23 просмотров)
GHOST_Kasper вне форума Ответить с цитированием
Старый 11.02.2008, 22:51   #6
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Почитайте про TCP/IP протокол, так же про UDP, на той же википедии. А про Winsock Api тот же MSDN
BOBAH13 вне форума Ответить с цитированием
Старый 12.02.2008, 06:57   #7
GHOST_Kasper
Пользователь
 
Аватар для GHOST_Kasper
 
Регистрация: 19.11.2007
Сообщений: 15
По умолчанию

Про протоколы TCP/IP и UDP я знаю. Только не писал для сети программы решил попрактиковаться для себя. Спасибо за ответы. Будем учить дальше.
GHOST_Kasper вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обработка исключительной ситуации artemavd Общие вопросы Delphi 10 28.07.2008 12:53
Исключительные ситуации FIIR БД в Delphi 5 19.06.2008 16:30
Исключительные ситуации FIIR Помощь студентам 1 19.06.2008 13:50
обработка ситуации неверного ввода данных Sweta Помощь студентам 0 22.11.2007 17:13
Исключительные ситуации Mickle Общие вопросы Delphi 6 07.10.2007 21:03