![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема при ClientSocket1Error [D6, Win95/98]
kalishenko stas © (2002-11-13 14:56:00)Возникла такая проблема: при обработке 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-21 10:44:00) [1]50-й порт: re-mail-ck
используй порты выше 10000 и проверяй не заняты ли они!
kalishenko (2002-11-20 15:20:00) [2]Отвечаю: ClientSocket1, ServerSocket1 - компоненты, свойству Port которых по умолчанию задано значение 50 (т.е. использую 50-й порт).
parenek (2002-11-20 15:04:00) [3]Из приведенного текста не видно - к какому порту пытается соединиться ClientSocket1. Если порт не задан изначально, то в этом и кроется ошибка.
Windows socket error [10049] - означает, что адрес не доступен.
kalishenko stas (2002-11-13 19:37:00) [4]Если кто-нибудь меня слышит, сообщаю: выдает ошибку "Windows socket error [10049]". Че это за ошибка?
kalishenko stas (2002-11-13 18:38:00) [5]Эй, Вы где!
kalishenko stas (2002-11-13 17:58:00) [6]>>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 17:12:00) [7]Clients - это ListBox, в котором имена машин в локальной сетке. При клике глобальной перем. а присваивается имя машины, которой будет отсылаться сообщение. (Извини, может мыслю по-ламерски, но я новичок в сокетах).
Sheriff (2002-11-13 16:49:00) [8]мда...
что делает процедура 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 16:45:00) [9]Что, никто не может помочь?
kalishenko stas (2002-11-13 16:11:00) [10]Все по прежнему. Да, еще, по-моему я ошибался, остальные процедуры работают тоже не нормально, т.е. приложение, похоже, зависает.
Может в них все дело:
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;
Sheriff (2002-11-13 15:57:00) [11]оставьте в процедуре только ErrorCode:=0;
что изменилось?
kalishenko stas (2002-11-13 15:44:00) [12]Но ведь в остальном приложение работает: даже подключается сокет к 127.0.0.1 и посылает сообщение самому себе, в общем, по идее, остальные процедуры работают нормально.
kalishenko stas (2002-11-13 15:38:00) [13]А, еще прикол. Попробовал в FormClose вставить Application.Destroy, так приложение (есс-но) закрывается, но в мониторе задач приложение существует. Че делать?
Sheriff (2002-11-13 15:36:00) [14]тогда откуда известно, что проблема в этой процедуре?
kalishenko stas (2002-11-13 15:33:00) [15]Не получается, к сожалению.
Sheriff (2002-11-13 15:25:00) [16]извиняюсь... я имел ввиду сокет
Socket.Close;
ShowMessage("Абонент находится вне зоны обслуживания");
ErrorCode:=0;
kalishenko stas (2002-11-13 15:16:00) [17]Не получается никак, только по Ctrl-F9 из Delphi.Тогда появляется "прерывание debug сессии".
Sheriff (2002-11-13 15:12:00) [18]а просто закрыть?