![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Многократное срабатывание ServerSocket1ClientError [D6, Win2k]
SergP. © (2005-10-28 18:14:00)наблюдается сабж.
procedure TForm1.ServerSocket1ClientError(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
mtemp.Lines.Add(formatfloat('000000',integer(Socket.Data)));
ErrorCode:=0;
// Socket.Close; //если закоментировано, то иногда, иначе часто
end;
procedure TForm1.ServerSocket1ClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
Mcode.Lines.Add(Socket.ReceiveText);
end;
при этом возникает переполнение стека и прога вылетает. В чем может быть проблема?
D6, WIN2K Server
SergP. (2005-10-28 23:49:00) [1]Извиняюсь...
Но все равно ничего не понимаю.
Переписал серверную часть с нуля, но практически точно так как было ранее
Но теперь все работает... Сравниваю исходники - отличий не нахожу...
но если компилирую из старого исходника - глючит. с нового - работает.
3,14сец какой-то...
Baltika-24 (2005-10-28 22:55:00) [2]unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ScktComp, StdCtrls;
type
TForm1 = class(TForm)
Memo1: TMemo;
ss: TServerSocket;
Button1: TButton;
procedure ssClientConnect(Sender: TObject; Socket: TCustomWinSocket);
procedure Button1Click(Sender: TObject);
procedure ssClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
procedure ssClientError(Sender: TObject; Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent; var ErrorCode: Integer);
procedure ssClientRead(Sender: TObject; Socket: TCustomWinSocket);
private
{ Private declarations }
public
procedure Display(s: String);
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Display(s: String);
begin
if Memo1.Lines.Count>200 then
begin
Memo1.Lines.Delete(0);
end;
Memo1.Lines.Add(FormatDateTime('h:nn:ss.zzz',now)+': '+s)
end;
procedure TForm1.ssClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
if ss.Socket.ActiveConnections>1 then
begin
Socket.Close;
Exit;
end;
Display('Client Connect');
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
ss.ServerType := stNonBlocking;
ss.Port := 999;
ss.Open;
end;
procedure TForm1.ssClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
Display('Client Disconnect');
end;
procedure TForm1.ssClientError(Sender: TObject; Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent; var ErrorCode: Integer);
begin
Display('Error establishing client, code='+IntToStr(ErrorCode));
ErrorCode := 0;
end;
procedure TForm1.ssClientRead(Sender: TObject; Socket: TCustomWinSocket);
var
Buf: String;
Len,Len1: Integer;
begin
Len := Socket.ReceiveLength;
repeat
SetLength(Buf,Len);
Len1 := Socket.ReceiveBuf(Buf[1],Len);
SetLength(Buf,Len1);
Display('Received: '+Buf);
if Len1=Len then break;
Len := Len-Len1;
until Len1=0;
end;
end.
SergP. (2005-10-28 22:45:00) [3]Только на D6
а то в D5 глюки совсем другие
Baltika-24 (2005-10-28 22:37:00) [4]Давай, сейчас сделаю простейшее - урони.
SergP. (2005-10-28 22:34:00) [5]Могу даже поспорить что любое приложение построеное на основе TServersocket вылетит если я приконекчусь к нему своим клиентом.
(конечно если там такие ошибки не отлавливаются в Application.OnError)
Baltika-24 (2005-10-28 22:26:00) [6]
> Если мне именно так нужно - значит по назначению.
Ну значит вылет сервера - это то, что тебе нужно.
Baltika-24 (2005-10-28 22:25:00) [7]
> Но почему в результате вылетает серверная - х/з.
Потому что ты не можешь знать, в какой момент система освободит внутренние буферы, в которые записаны данные.
SergP. (2005-10-28 22:21:00) [8]
> Это очередная кривоватость кода.
>
> Вот это используется не по назначению:
Если мне именно так нужно - значит по назначению.
А мне нужно забирать данные именно в момент дисконекта.
Да и пробовал я вообще отключать все события у ServerSocket.
Все равно он вываливается.
Я могу согласится с тем что клиентская часть кривая. Но почему в результате вылетает серверная - х/з.
Но у Борланда насколько я помню были проблемы с TClientSocket и TServersocket в Delphi 5, а в Delphi 6 старые глюки исправлены, но зато новые добавлены...
Baltika-24 (2005-10-28 21:54:00) [9]
> Или это очередные глюки Борланда?
Это очередная кривоватость кода.
Вот это используется не по назначению:
procedure TForm1.ServerSocket1ClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
Mcode.Lines.Add(Socket.ReceiveText);
end;
SergP (2005-10-28 21:49:00) [10]В клиенте сделано так:
procedure TForm1.ClientSocket1Write(Sender: TObject;
Socket: TCustomWinSocket);
begin
Socket.SendText(Memo1.Text);
socket.close;
end;
Если я убираю socket.close отсюда, то все работает нормально.
Но одного понять не могу: Если даже я сильно намутил в клиентском приложении, то почему серверное вываливается?
Или это очередные глюки Борланда?
SergP. (2005-10-28 18:25:00) [11]Причем это происходит и при нормальном дисконекте.
Может из-за этого:?
procedure TForm1.ServerSocket1ClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
Mcode.Lines.Add(Socket.ReceiveText);
end;
но мне нужно забрать данные за один раз, чтобы не заморачиваться с хранением частей (если пришлось бы принимать по частям в соответствующем событии), тем более что данных не много. не более 1 кб
SergP. (2005-10-28 18:15:00) [12]PS. mtemp и mcode - Tmemo