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

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

Какой-то глюк с ClientSocket [D5, Win95/98]


TankMan ©   (2003-02-12 00:52:00) 

Поставил этот сокет, настроил, чтобы он при создании формы, пытался коннектится по IP-шнику одному, поставил обработчик, в его же свойствах OnError, чтобы закрывал сокет, выдавал сообщение об ошибке подключения и занулял ошибку.... в итоге запускаю в дельфях появляется сообщение уведомляющее меня о том, что неполучается создать новый сокет, ошибка возникает именно после команды open, и до обработчика OnError не доходит эта ошибка, поставил подключение сокета в try...except ошибка выдается моя, но всеравно, если дальше в программе без этих try...except пытатся подключится, выдается системное сообщение :(.. в чем может быть проблема? может чего в настройках проэкта ? или еще чего? А может обработчик как нибудь самому поставить? Если так, то пример бы совсем не помешал...


TankMan   (2003-02-17 00:33:00) [1]

Тоже верно :)


mrcat   (2003-02-15 00:39:00) [2]

TankMan © (15.02.03 00:23)
>>Дык блин... мне не в одном месте прийдется пытаться коннектить клиента, и в каждом писать эти все try except


Дык, млин, что б не "засорять код" процедуру коннекта надо локализовать! А не страдать - вызывая коннект в разных частях программы =)


TankMan   (2003-02-15 00:23:00) [3]

>>Digitman
Дык блин... мне не в одном месте прийдется пытаться коннектить клиента, и в каждом таком месте писать эти все try except и т.д.? Засорять код...


TButton   (2003-02-14 20:35:00) [4]

какие умные мысли поперли... меня до таких еще апгрейдить и апгрейдить...


Digitman   (2003-02-14 08:22:00) [5]

чего мудрить-то ?
все сведения для идентификации отказа и его обработки доступны тебе :

try
ClientSocket1.Open;
except
on e: ESocketError do
begin
if e.Message = "Can""t create new socket" then
ShowMessage("Хрень какая-то у меня с TCP-протоколом");
end
else
raise;
end;


ole   (2003-02-14 04:38:00) [6]

А может просто пытаться инициализировать WinSock в самом начале, просто проверяя есть ли возможность привязки к TCP/IP?


TankMan   (2003-02-14 01:22:00) [7]

А может может можно как-то отлавливать эту ошибку, кроме try...except ? Можть на какое-то сообщение или обрабатывать все сообщения об ошибках и среди них искать такую ошибку и выдавать свое сообщение? Если так? никто не знает как сделать такой обработчик?


Digitman   (2003-02-13 08:24:00) [8]

потому что компонент TClientSocket пытается создать гнездо с явно ассоциированным с ним протоколом TCP ... на этапе вызова ф-ции socket() и происходит ошибка... т.е. до connect() даже дело не доходит


mrcat   (2003-02-13 01:02:00) [9]

TankMan © (13.02.03 00:19)
>>почему же без TCP ошибка не доходит? Должна же наверное?


TCustomSocket.OnError
Occurs when the socket fails in making, using, or shutting down a connection.

О присутствии TCP-протокола здесь ничего не сказано.


TankMan   (2003-02-13 00:19:00) [10]

Точно!! =))Я удалил контроллер удаленного доступа, а сетевушку вытащил, поэтому и вообще TCP небыло, а в инет я выхожу с ХР.. точно, точно... щас попробовал, получилось.. обработчик заработал... НО, Обработчик ошибок он и в африке обработчик, почему же без TCP ошибка не доходит? Должна же наверное?


TButton   (2003-02-12 18:11:00) [11]

2Digitman ©
А как без TCP-протокола ИНет юзать?


Digitman   (2003-02-12 11:20:00) [12]


> вроде "Can"t create new socket" вроде так...


не "вроде", а - точное сообщение приводи

сдается мне, что у тебя TCP-протокол не установлен


TankMan   (2003-02-12 11:13:00) [13]

Самый то прикол, что когда я в ХР запускаю тот же код, он нормально работает, но трабла в том, что я пишу прожку под 98, а не для ХР. А код приводить..
вобщем на форме у меня стоит компонент scClient.

procedure TfrmMain.FormCreate(Sender: TObject);
........
csClient.address:=IPServer;
csClient.Port:=8194;
csClient.open; <<== Вот на этой строчке возникает ошибка
вроде "Can"t create new socket" вроде так...
.........

А вот что, в обработчике ошибок...
procedure TfrmMain.csClientError(Sender: TObject; Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent; var ErrorCode: Integer);
begin
csClient.Close;
MessageDlg("Произошла ошибка подключения к серверу",mtError,[mbOK],0);
ErrorCode:=0;
end;

И в итоге получается, что до этого он и не доходит :(


Digitman   (2003-02-12 09:38:00) [14]

> //Если сконнектились то вырубаем таймер

"вырубать" нужно в собственном обработчике таймера, после ClientSocket1.Active:= True

"врубать" же следует в OnError() после обработки ошибки, если ошибка связана именно с недоступностью хоста


mrcat   (2003-02-12 09:24:00) [15]

код показывайте


dimich1978   (2003-02-12 08:46:00) [16]

Понятно тебе типа связь нужна устойчивая между сервером и клиентом.
Так вот посмотри на примере как это работает по поиску на этом сайте найди готовую прогу с исходниками Server-Klient 1.0
или так
//Если отсоединился включаем таймер на новый коннект
procedure TForm1.ClientSocket1Disconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
timer2.enabled:=true;
end;
//обрабатываем ошибку
procedure TForm1.ClientSocket1Error(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
ClientSocket1.Socket.Disconnect(ClientSocket1.Socket.SocketHandle);
ErrorCode:= 0;
end;

//Читаем из реестра порт и айпи и коннектимся
procedure TForm1.Timer2Timer(Sender: TObject);
var regini:tregistry;
begin
RegIni:=TRegIniFile.Create;
RegIni.RootKey:=HKEY_CURRENT_USER;
RegIni.OpenKey("SOFTWARE",true);
RegIni.OpenKey("DvaASoft",true);
RegIni.OpenKey("CONFIG",true);
if not ClientSocket1.Active then
if (regini.readString("IP")<>"")and(regini.readString("Port")<>"") then begin
clientsocket1.Host:=regini.readString("IP");
clientsocket1.Port:=strtoint(regini.readString("Port"));
clientsocket1.Active:=true;
end;
regini.free;
end;
//Если сконнектились то вырубаем таймер
procedure TForm1.ClientSocket1Connecting(Sender: TObject;
Socket: TCustomWinSocket);
begin
timer2.Enabled:=false;
end;


TButton   (2003-02-12 08:46:00) [17]

какое именно сообщение?
варианты:
1.переставь с onCreate на onActivate.
2.бросай Дэлфу, садись за умные книги /посвящаю этот вариант Ketmar"у/


TankMan   (2003-02-12 00:54:00) [18]

Да забыл сказать... IP-шника, который я указываю несуществует... (от сети отключился)


Наверх

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