Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.02.05;
Скачать: CL | DM;

Вниз

Многократное срабатывание ServerSocket1ClientError   Найти похожие ветки 

 
SergP.   (2005-10-28 18:14) [0]

наблюдается сабж.


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 18:15) [1]

PS. mtemp и mcode - Tmemo


 
SergP.   (2005-10-28 18:25) [2]

Причем это происходит и при нормальном дисконекте.
Может из-за этого:?

procedure TForm1.ServerSocket1ClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
Mcode.Lines.Add(Socket.ReceiveText);
end;

но мне нужно забрать данные за один раз, чтобы не заморачиваться с хранением частей (если пришлось бы принимать по частям в соответствующем событии), тем более что данных не много. не более 1 кб


 
SergP ©   (2005-10-28 21:49) [3]

В клиенте сделано так:

procedure TForm1.ClientSocket1Write(Sender: TObject;
 Socket: TCustomWinSocket);
begin
 Socket.SendText(Memo1.Text);
 socket.close;
end;

Если я убираю socket.close отсюда, то все работает нормально.
Но одного понять не могу: Если даже я сильно намутил в клиентском приложении, то почему серверное вываливается?
Или это очередные глюки Борланда?


 
Baltika-24   (2005-10-28 21:54) [4]


> Или это очередные глюки Борланда?


Это очередная кривоватость кода.

Вот это используется не по назначению:

procedure TForm1.ServerSocket1ClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
Mcode.Lines.Add(Socket.ReceiveText);
end;


 
SergP.   (2005-10-28 22:21) [5]


> Это очередная кривоватость кода.
>
> Вот это используется не по назначению:


Если мне именно так нужно - значит по назначению.
А мне нужно забирать данные именно в момент дисконекта.

Да и пробовал я вообще отключать все события у ServerSocket.
Все равно он вываливается.

Я могу согласится с тем что клиентская часть кривая. Но почему в результате вылетает серверная - х/з.

Но у Борланда насколько я помню были проблемы с TClientSocket и TServersocket в Delphi 5, а в Delphi 6 старые глюки исправлены, но зато новые добавлены...


 
Baltika-24   (2005-10-28 22:25) [6]


> Но почему в результате вылетает серверная - х/з.


Потому что ты не можешь знать, в какой момент система освободит внутренние буферы, в которые записаны данные.


 
Baltika-24   (2005-10-28 22:26) [7]


> Если мне именно так нужно - значит по назначению.


Ну значит вылет сервера - это то, что тебе нужно.


 
SergP.   (2005-10-28 22:34) [8]

Могу даже поспорить что любое приложение построеное на основе TServersocket вылетит если я приконекчусь к нему своим клиентом.
(конечно если там такие ошибки не отлавливаются в Application.OnError)


 
Baltika-24   (2005-10-28 22:37) [9]

Давай, сейчас сделаю простейшее - урони.


 
SergP.   (2005-10-28 22:45) [10]

Только на D6
а то в D5 глюки совсем другие


 
Baltika-24   (2005-10-28 22:55) [11]

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 23:49) [12]

Извиняюсь...
Но все равно ничего не понимаю.
Переписал серверную часть с нуля, но практически точно так как было ранее

Но теперь все работает... Сравниваю исходники - отличий не нахожу...
но если компилирую из старого исходника - глючит. с нового - работает.

3,14сец какой-то...



Страницы: 1 вся ветка

Текущий архив: 2006.02.05;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.026 c
2-1136627227
Goblin
2006-01-07 12:47
2006.02.05
Сссылка


11-1118243553
Владимир Кладов
2005-06-08 19:12
2006.02.05
Смешивание звуков


15-1137360108
Gero
2006-01-16 00:21
2006.02.05
Я был в шоке когда прочитал


2-1137698958
Dead.MorozZ
2006-01-19 22:29
2006.02.05
CH Pack


4-1132574695
NiGGa
2005-11-21 15:04
2006.02.05
Информация о программе.