Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Проблема с разрывом socket соединения [D5, D6, D7, Win2k]


Страницы:   1 2 3

Furyous ©   (2004-06-23 08:10:00) 

Такая проблема: если в чате(ClientSocket) у клиента завершить процесс, то сервак выдаёт ошибку сокета и падает. Нужно как-то закрывать соединение с таким клиентом, но ничего не получается.


Furyous   (2004-06-23 19:37:00) [41]

Блин, всё-равно Socket Error и вылетевший юзер остаётся в юзер листе на серваке. Исключения воткнул везде, где надо, а не выходит =(

2Snap:
Пробовал, чёт не получалось. Мыльни примерчик если есть, желательно с отправкой файлов по локалке =) fjack@tut.by


Furyous   (2004-06-23 19:35:00) [42]

Блин, всё-равно Socket Error и вылетевший юзер остаётся в юзер листе на серваке. Исключения воткнул везде, где надо, а не выходит =(

2Snap:
Пробовал, чёт не получалось. Мыльни примерчик если есть, желательно с отправкой файлов по локалке =) fjack@tut.by


Snap   (2004-06-23 18:09:00) [43]

А вообще переходи на Indy.


Furyous   (2004-06-23 18:01:00) [44]

Благодарю, надеюсь до пятницы успею...


Digitman   (2004-06-23 17:26:00) [45]

начни с изучения особенностей ПОТОЧНОГО протокола TCP/IP - в условиях глоб.сети эта чатообразная галиматья, бездумно содранная откуда-то и чуть "доработанная", функционировать ожидаемым образом не будет

для отслеживания нештатного обрыва "клиента" при исполнении обработчиков OnClientRead/OnClientWrite следует любые вызовы read/write-методов заключать в блок try..except, при возникновении исключения в блоке except выполнять Socket.Close и немедленно завершать дальнейшее выполнение обработчика


Furyous   (2004-06-23 16:37:00) [46]

вот сервер:
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
 Socket: TCustomWinSocket);
var s, c, l: string;
    i: Integer;
    fstream: tmemorystream;
begin
fstream := tmemorystream.Create;
 s := Socket.ReceiveText;

 if (Copy(s,1,2) = '#N') then begin
  Delete(s,1,2);
  ListBox1.Items.Add(s);
  s := '#U';
  for i := 0 to ListBox1.Items.Count - 1 do
   s := s + ListBox1.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') then begin
  for i := 0 to ServerSocket1.Socket.ActiveConnections-1 do
   ServerSocket1.Socket.Connections[i].SendText(s);
  Exit;
 end;
end;
{  if (Copy(s,1,2) = '#F') then
 begin
  ServerSocket1.Socket.Connections[0].SendStream(fstream);
 end;}

procedure TForm1.ServerSocket1ClientDisconnect(Sender: TObject;
 Socket: TCustomWinSocket);
var i: Integer;
begin
 ListBox1.Items.Clear;
 for i := 0 to ServerSocket1.Socket.ActiveConnections-1 do
  ServerSocket1.Socket.Connections[i].SendText('#N');
end;

procedure TForm1.kickClick(Sender: TObject);
begin
 ServerSocket1.Socket.Connections[ListBox1.ItemIndex].Close;
end;

procedure TForm1.ListBox1Click(Sender: TObject);
begin
Edit1.Text := ServerSocket1.Socket.Connections[listbox1.itemindex].RemoteAddress;
end;

procedure TForm1.FormCreate(Sender: TObject);
var IPIni: TIniFile;
begin
 IPIni := TIniFile.Create('.\IP.ini');
 port.text := IPIni.ReadString('Server', 'Port', '1001');
 IPIni.Free;
end;

procedure TForm1.Button3Click(Sender: TObject);
var
 c,l : string;
begin

   SetLength(l, StrLen(PChar(c)) + 1);
   StrLCopy(@l[1], PChar(c), Length(l) - 1);
   DataSize := StrToInt(l);
   Data := TMemoryStream.Create;

   Delete(c, 1, Length(l));
   Reciving:= true;

end;

procedure TForm1.ServerSocket1ClientError(Sender: TObject;
 Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
 var ErrorCode: Integer);
 var i:         integer;
begin
//  ListBox1.Items.Clear;
//  ListBox1.Refresh;
//  for i := 0 to ServerSocket1.Socket.ActiveConnections-1 do
//  ServerSocket1.Socket.Connections[i].Close;
end;


Digitman   (2004-06-23 08:59:00) [47]


> куда его вешать?


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


Furyous   (2004-06-23 08:38:00) [48]

Есть, а куда его вешать? На OnClientError не помогает.


Digitman   (2004-06-23 08:18:00) [49]


> сервак выдаёт ошибку сокета и падает


на то есть try..except


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо