Форум: "Сети";
Текущий архив: 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.008 c