Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Проблема при 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]

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо