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

Вниз

Коннект Клиент-Сервер   Найти похожие ветки 

 
dimich1978 ©   (2003-02-13 14:17) [0]

Вот мой код для решения проблемы когда сервер отрубается, то клиенты потом должны "ВСЕ " сконнектится заново.
Но дело в том что допустим из 10 компов коннектятся заново только два вместо всех. С чем это связано непойму. На основе совета Digitman_а я написал такой код, но че то непашет, так и осталось что компы некоторые не коннектятся, в чем может быть дело?
КЛИЕНТ
------
Если от сервера пришел опрос, где лабел1 хранит имя компа.
...
if ("opros"=s) then SendLongText(ClientSocket1.Socket,"opros"+label1.caption);
...
procedure TForm1.ClientSocket1Error(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
ClientSocket1.Socket.Disconnect(ClientSocket1.Socket.SocketHandle);
ErrorCode:= 0;
timer2.enabled:=true;
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;
if clientsocket1.Active then timer2.Enabled:=false;
end;
regini.free;
end;

СЕРВЕР
------
....
Саму S я обрабатываю(склейка и фрагментация выполняется)
в s приходит от клиента после опроса oprosИМЯКОМПА
ss:=copy(s,6,length(s));
if copy(s,0,5)="opros" then
begin
for i:=0 to combobox1.Items.count-1 do
if ss=combobox1.Items.strings[i] then k:=1;
if k=0 then combobox1.Items.add(ss);
end;
....
Процедура опроса включенных клиентов
procedure TForm1.Timer1Timer(Sender: TObject);
var kl:integer;
begin
timer1.Interval:=30000;
for kl:=0 to serversocket1.Socket.ActiveConnections-1 do begin
SendLongText(serverSocket1.Socket.connections[kl],"opros");
end;
combobox1.Clear;
end;


 
dimich1978 ©   (2003-02-13 14:19) [1]

Протокол TCP везде стоит


 
Digitman ©   (2003-02-13 15:06) [2]

procedure TForm1.Timer2Timer(Sender: TObject);

... здесь устанавливаем параметры коннекта - адрес или имя_хоста + № порта

// не майся дурью - один раз при инициализации приложения прочитай из реестра параметры коннекта, держи их в памяти приложения и не лезь в реестр всякий раз по таймеру ! к ресурсам системы нужно относится бережно)))

// теперь - поехали :

clientsocket1.Active:=true; // запуск асинхр.логики коннекта
timer2.Enabled:=false; // выключим таймер, снова включим его при ошибке недоступности хоста/порта или, если нужно, при дисконнекте для попытки восстановления разорванного коннекта

end;

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
case ErrorCode of // что за ошибка ?
WSAECONNREFUSED, // хост недоступен или порт неактивен
WSAECONNABORTED, // хост прервал предудущий коннект по своей инициативе
WSAECONNRESET: // коннект разорван по иным причинам
begin
Socket.Disconnect(Socket.SocketHandle); // закроем гнездо
ErrorCode:= 0; // сбросим ошибку
timer2.enabled:=true; // запустим таймер
end;
end;
end;


p.s. передающая сторона использует событие OnWrite() ?


 
dimich1978 ©   (2003-02-13 15:41) [3]

Нет не используется.


 
Digitman ©   (2003-02-13 15:53) [4]

без OnWrite() (при использовании неблок.режима) ничего работать как положено не будет - имей это ввиду


 
dimich1978 ©   (2003-02-13 16:57) [5]

Спасибо большое.



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

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

Наверх




Память: 0.48 MB
Время: 0.011 c
3-19483
Виталий Панасенко
2003-03-18 14:01
2003.04.07
FIBPlus&Exception


14-19783
AVR
2003-03-18 10:07
2003.04.07
Delphi -> Kylix ?


14-19843
Tornado
2003-03-21 08:00
2003.04.07
Помогите с InstallShield


1-19619
Opera
2003-03-25 12:33
2003.04.07
Прилипание


3-19451
ilandrei
2003-03-18 15:14
2003.04.07
Вопрос к знатокам динамического SQL