Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2003.04.07;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.007 c
6-19715
Карелин Артем
2003-02-14 10:06
2003.04.07
NMUDP. Есть вопросы.


14-19837
GDBoy
2003-03-20 21:48
2003.04.07
Для тех кто сидел...


1-19529
Pavel_
2003-03-26 14:25
2003.04.07
выполенние процедуры по указателю


3-19456
gonta
2003-03-18 23:13
2003.04.07
Помогите составить SQL запрос


3-19503
Behemoth
2003-03-20 10:26
2003.04.07
Ошибка при вызове ADOQuery.ExecSQL...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский