![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема с разрывом socket соединения [D5, D6, D7, Win2k]
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