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

Вниз

Проблема при ClientSocket1Error   Найти похожие ветки 

 
kalishenko stas   (2002-11-13 14:56) [0]

Возникла такая проблема: при обработке ClientSocket1Error при возникновении ошибки (т.е. не могу подключиться к какой-то машине) приложение не может закрыться (как по Alt-f4, так и по "крестику"). Хотя оно не зависает, поскольку Maximize и сворачивание окна работает, да и функционирует вроде нормально, а закрыть его не могу ("светит" только перезагрузка). Код обработчика выглядит так:

procedure TForm1.ClientSocket1Error(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
ClientSocket1.Socket.Disconnect(ClientSocket1.Socket.SocketHandle);
while ClientSocket1.Active do Application.ProcessMessages;
if not ClientSocket1.Active then
ShowMessage("Абонент находится вне зоны обслуживания");
ErrorCode:=0;
end;


 
Sheriff   (2002-11-13 15:12) [1]

а просто закрыть?


 
kalishenko stas   (2002-11-13 15:16) [2]

Не получается никак, только по Ctrl-F9 из Delphi.Тогда появляется "прерывание debug сессии".


 
Sheriff   (2002-11-13 15:25) [3]

извиняюсь... я имел ввиду сокет
Socket.Close;
ShowMessage("Абонент находится вне зоны обслуживания");
ErrorCode:=0;


 
kalishenko stas   (2002-11-13 15:33) [4]

Не получается, к сожалению.


 
Sheriff   (2002-11-13 15:36) [5]

тогда откуда известно, что проблема в этой процедуре?


 
kalishenko stas   (2002-11-13 15:38) [6]

А, еще прикол. Попробовал в FormClose вставить Application.Destroy, так приложение (есс-но) закрывается, но в мониторе задач приложение существует. Че делать?


 
kalishenko stas   (2002-11-13 15:44) [7]

Но ведь в остальном приложение работает: даже подключается сокет к 127.0.0.1 и посылает сообщение самому себе, в общем, по идее, остальные процедуры работают нормально.


 
Sheriff   (2002-11-13 15:57) [8]

оставьте в процедуре только ErrorCode:=0;
что изменилось?


 
kalishenko stas   (2002-11-13 16:11) [9]

Все по прежнему. Да, еще, по-моему я ошибался, остальные процедуры работают тоже не нормально, т.е. приложение, похоже, зависает.
Может в них все дело:

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
begin
Allmess.Lines.Add("From "+Socket.RemoteHost + ": "+Socket.ReceiveText);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Allmess.Text:="";
a:="";
ShownOnce:= true;
//CreateTrayIcon(1);
end;

procedure TForm1.Connect;
begin
if not ClientSocket1.Active then begin
ClientSocket1.Host := a;
ClientSocket1.Active:=True;
end;
end;

procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
Allmess.Text:=Allmess.Text+"To "+ a +": "+ Mess.Text;
Connect;
while not ClientSocket1.Active do Application.ProcessMessages;
ClientSocket1.Socket.SendText(Mess.Text);
ClientSocket1.Active:=False;
end;


procedure TForm1.ClientsClick(Sender: TObject);
var s: string[20];
ss: integer;
begin
a:="";
ss:=Clients.ItemIndex;
s:=Clients.Items[ss];
for ss:=0 to length(s) do
a[ss]:=s[ss];
ShowMessage(a);
end;

procedure TForm1.ClientSocket1Error(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
// while ClientSocket1.Active do Application.ProcessMessages;
// ClientSocket1.Active:=False;
// ClientSocket1.Socket.Disconnect(ClientSocket1.Socket.SocketHandle);
// Socket.Close;
// while ClientSocket1.Active do Application.ProcessMessages;
// if not ClientSocket1.Active then

// ShowMessage("Абонент находится вне зоны обслуживания");
ErrorCode:=0;
end;


procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
//Close;
//Application.Destroy;
end;



procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
CanClose:=True;
end;


 
kalishenko stas   (2002-11-13 16:45) [10]

Что, никто не может помочь?


 
Sheriff   (2002-11-13 16:49) [11]

мда...
что делает процедура ClientsClick?

//проверку на наличие текста и выбранный Clients.Items
//сделай сам
a:=Clients.Items[Clients.ItemIndex];
with ClientSocket1 do begin
Host:=a; //надеюсь, порт указан...
try
Open;
if Socket.SendText(Mess.Text)>0 then
Allmess.add("To "+ a +": "+ Mess.Text);
finally
Close;
end;
end;


 
kalishenko stas   (2002-11-13 17:12) [12]

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


 
kalishenko stas   (2002-11-13 17:58) [13]

>>2Sheriff

Приложение благодаря Вашему примеру закрывается, только кнопку для отсылки сообщения, на которую я повесил обработчик, нужно нажимать дважды. По-моему, сокет не успевает подконнектится, потому что, вставив Application.ProcessMessages, а именно:

with ClientSocket1 do begin
Host:=a;
try
Open;
while not ClientSocket1.Active do Application.ProcessMessages;
if Socket.SendText(Mess.Text)>0 then
Allmess.Text:=Allmess.Text+"To "+ a +": "+ Mess.Text;
finally
Close;
end;
end;
- отсылает сообщение после первого клика, однако опять зависает, т.е. ошибка в Application.ProcessMessages. Тогда как избавиться от этого глюка.


 
kalishenko stas   (2002-11-13 18:38) [14]

Эй, Вы где!


 
kalishenko stas   (2002-11-13 19:37) [15]

Если кто-нибудь меня слышит, сообщаю: выдает ошибку "Windows socket error [10049]". Че это за ошибка?


 
parenek   (2002-11-20 15:04) [16]

Из приведенного текста не видно - к какому порту пытается соединиться ClientSocket1. Если порт не задан изначально, то в этом и кроется ошибка.

Windows socket error [10049] - означает, что адрес не доступен.




 
kalishenko   (2002-11-20 15:20) [17]

Отвечаю: ClientSocket1, ServerSocket1 - компоненты, свойству Port которых по умолчанию задано значение 50 (т.е. использую 50-й порт).


 
Sheriff   (2002-11-21 10:44) [18]

50-й порт: re-mail-ck
используй порты выше 10000 и проверяй не заняты ли они!



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

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

Наверх




Память: 0.51 MB
Время: 0.018 c
1-62516
arcoant
2003-01-10 17:15
2003.01.20
Buttons


8-62664
Сергей С
2002-09-22 03:01
2003.01.20
Как написать DSP-плагин к Winamp у? В примерах есть визуальный пл


14-62810
Sancho
2003-01-01 09:48
2003.01.20
С наступившим


4-62905
Serega Belov
2002-12-03 12:13
2003.01.20
WinExec и Winoldap в Delphi 6.


14-62793
ПИТОН
2002-12-31 06:56
2003.01.20
Новый Год