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