Текущий архив: 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