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

Вниз

TspClient и TspServever   Найти похожие ветки 

 
kostyl_kostyl   (2009-08-14 16:19) [120]

блин, асинхронные режим - жестокая штука, ни какой однозначности. Теперь сервер не ловит запросов...


 
kostyl_kostyl   (2009-08-14 16:33) [121]

а, я понял сервер ждет данных, которые отослали до соединения. Как узнать что соединение установлено? Если оно не установлено, то к примеру  по Сергей М. ©   (13.08.09 16:10) [97] в вайл не зайдет программа? Есть событие какое-то?


 
kostyl_kostyl   (2009-08-14 17:40) [122]

есть, OnError....


 
Anatoly Podgoretsky ©   (2009-08-14 17:45) [123]

OnAccept


 
kostyl_kostyl   (2009-08-14 17:51) [124]


> Anatoly Podgoretsky ©   (14.08.09 17:45) [123]
>
> OnAccept

ааа... Ну мне надо тоже учитывать таймут коннекта, поэтому я отсылаю запрос на коннект, а потом вхожу в цилк и в нем посылаю запрос; и если в OnError ошибка=WSAENOTCONN, кручусь дальше, пока таймаут не сработает или ошибки WSAENOTCONN не будет. Нормальны вариант?


 
Anatoly Podgoretsky ©   (2009-08-14 20:11) [125]

> kostyl_kostyl  (14.08.2009 17:51:04)  [124]

Вопрос был другой, а для этого вопроса OnError, но при нормальном коннекте OnError не будет. Механизм в сильном приближение такой

OnListen > OnAccept|OnError (выход) > работа с сокетом  > OnDisconnect

И про что ты сейчас говоришь про сервер или про клиента, я про сервер.


 
kostyl_kostyl   (2009-08-14 23:54) [126]

Ха. А я про клиент.


 
Сергей М. ©   (2009-08-15 01:00) [127]


> kostyl_kostyl   (14.08.09 14:52) [118]


А ты не пробовал справку почитать ?
В ней ВСЕ написано - какие коды отказов ждать от той или иной ф-ци при тех или иных условиях ..

У меня, знаешь ли, нет великого желания цитировать ее здесь, справку ту самую.


> асинхронные режим - жестокая штука


Да уж)

Эт тебе не Пых-Пых развратный: вызвал какую-нть хрень - и жди результата, бо обязательно тут же будет)


> Как узнать что соединение установлено?


Вызывай повторно Open.. И следи ВНИМАТЕЛЬНО за OnError и OnConnect.


 
Сергей М. ©   (2009-08-15 01:07) [128]


> если в OnError ошибка=WSAENOTCONN, кручусь дальше


Справка гласит:

For a nonblocking socket, until the connection attempt completes all subsequent calls to connect on the same socket will fail with the error code WSAEALREADY.

Зачем нести отсебячину ?


 
kostyl_kostyl   (2009-08-15 11:36) [129]

Спасибо.


 
kostyl_kostyl   (2009-08-17 11:04) [130]

Я так понял мне надо еще проверять WSAEWOULDBLOCK  кроме WSAEALREADY?


 
Сергей М. ©   (2009-08-17 11:07) [131]

Всенепременно)


 
kostyl_kostyl   (2009-08-17 11:23) [132]

Наверно проще будет написать обертку для таких случаев, чтобы в следующий раз не париться...


 
Anatoly Podgoretsky ©   (2009-08-17 11:48) [133]

> kostyl_kostyl  (14.08.2009 17:51:04)  [124]

Это неверный алгоритм, протим принципов работы ассинхронных компонент, до Accept не надо ничего посылать, а то тебя быстро в хакеры зачислят файрволы и возможно на заметку возьмут администраторы.


 
Anatoly Podgoretsky ©   (2009-08-17 11:50) [134]

> kostyl_kostyl  (14.08.2009 17:51:04)  [124]

Ты похоже просто не понимаешь ни принципы работы ассинхронной работы и что важнее принципы работы серверов и клиентов через TCP/IP. Это протокол с акцептированием, без акцептирования рвутся только сетевые черви.


 
kostyl_kostyl   (2009-08-17 12:12) [135]

Да, я действительно не знаю принципов работы  серверов и клиентов через TCP/IP. Знаю там, запрос - ответ, и все. Это мне урок. Дык мне просто полсать запрос на OnConnect клиента и не париться с циклами этими? Или как?


 
Сергей М. ©   (2009-08-17 12:16) [136]


> не париться с циклами этими


Не париться при bmNonBlocking  не получится - пропотеть таки придется)


 
kostyl_kostyl   (2009-08-17 12:20) [137]

Так что мне делать?


 
Сергей М. ©   (2009-08-17 12:23) [138]


> что мне делать?


Что тебе не понятно ?


 
kostyl_kostyl   (2009-08-17 12:38) [139]

Мне все время выдается WSAEWOULDBLOCK и таймаут заканчивается. Если у клиента режим на блокирующий, то у сервера тоже должен быть не блокирующий? У меня стоит среадблокинг? Это как будет влиять на взаимодействие с клиентом, который находиться в режиме нотблокинг?


 
Сергей М. ©   (2009-08-17 12:49) [140]


> Мне все время выдается WSAEWOULDBLOCK


Показывай код..


> Если у клиента режим на блокирующий, то у сервера тоже должен
> быть не блокирующий?


Фиолетово.
Клиентам нет и не должно быть никакого дела до режимов серверных сокетов, равно как и наоборот.


> среадблокинг? Это как будет влиять на взаимодействие с клиентом,
>  который находиться в режиме нотблокинг?


Серверу до лампочки режимы клиентов. Его задача - вовремя и безотказно обслужить запросы своих клиентов. Как и в каком режиме это будет делать сервер - клиентам точно так же до лампочки.


 
kostyl_kostyl   (2009-08-17 12:58) [141]

Это запрос. Выполняется однажды в одной операции обращения к серверу. Таких операций может быть много.

 ConnectToServer := False;
 WasCanselErrors := False;
 If TcpClient.Connected then
   TcpClient.Disconnect;
 TcpClient.Connect;
 StartTryConnectTime := Now();
 while not ConnectToServer do
 begin
   Application.ProcessMessages;
   if ((Now - StartTryConnectTime) > 0.0005)
   or WasCanselErrors then
   begin
     Result := False; //нет соединения с сервером
     Exit;
   end;
   ConnectToServer := True;
   TcpClient.SendBuf(ServerRequest, 256);
 end;

OnError клиента:
 if (SocketError = WSAEALREADY)
 or (SocketError = WSAEWOULDBLOCK)
 or (SocketError = WSAENOTCONN)
 then //Если нет коннекта
 begin
   ConnectToServer := False;
 end;
 if (SocketError <> WSAEWOULDBLOCK)
 and (SocketError <> WSAEISCONN)  then
 begin
   TTCPClient(Sender).Disconnect;
   WasCanselErrors := True;
 end;


 
Сергей М. ©   (2009-08-17 16:48) [142]

type
 TTcpClientFriend = class(TTcpClient)
 protected
   function ErrorCheck(rc: Integer): Integer; override;
 end;

procedure TForm1.Button3Click(Sender: TObject);
begin
 Memo.Clear;
end;

var
 ConnError: Boolean;
 ConnErrorCode: Cardinal;
 ResponseString: String;

procedure TForm1.Button6Click(Sender: TObject);
var
 TcpClient: TTcpClientFriend;
begin
 TcpClient := TTcpClientFriend.Create(nil);
 try
   TcpClient.OnError := TcpClientError;
   TcpClient.OnConnect := TcpClientConnect;
   TcpClient.RemoteHost := "ya.ru";
   TcpClient.RemotePort := "80";
   TcpClient.BlockMode := bmNonBlocking;
   ConnError := False;
   Timer.Interval := 5000;

   Timer.Enabled := True;
   while Timer.Enabled and not (TcpClient.Connected or Application.Terminated or ConnError) do begin
     TcpClient.Connect;
     Application.ProcessMessages;
   end;
   if not TcpClient.Connected then
     Exit;

   Timer.Enabled := True;
   while Timer.Enabled and not (Application.Terminated or ConnError) do begin
     if TcpClient.Sendln("запрос") <> SOCKET_ERROR then
       Break;
     Application.ProcessMessages;
   end;
   if Application.Terminated or ConnError then
     Exit;

   Timer.Enabled := True;
   while Timer.Enabled and not Application.Terminated and (ResponseString = "") do begin
     ResponseString := TcpClient.Receiveln("");
     if ConnError then
       Break;
     Application.ProcessMessages;
   end;
   Memo.Lines.Add(ResponseString);

 finally
   TcpClient.Free;
 end;
end;

procedure TForm1.TcpClientError(Sender: TObject; SocketError: Integer);
begin
 case SocketError of
   WSAEWOULDBLOCK, WSAEALREADY, WSAEINVAL:;
 else
   Timer.Enabled := False;
   ConnErrorCode := SocketError;
   ConnError := True;
 end;
end;

procedure TForm1.TcpClientConnect(Sender: TObject);
begin
 Timer.Enabled := False;
end;

procedure TForm1.TimerTimer(Sender: TObject);
begin
 Timer.Enabled := False;
end;

{ TTcpClientFriend }

function TTcpClientFriend.ErrorCheck(rc: Integer): Integer;
begin
 if (rc = SOCKET_ERROR) and (WSAGetLastError = WSAEISCONN) then
   Result := 0
 else
   Result := inherited ErrorCheck(rc);
end;


Для работы клиента в неблок.режиме проще будет отказаться от TTcpClient в пользу штатного TClientSocket или TCP-клиента в составе ICS.


 
kostyl_kostyl   (2009-08-17 17:56) [143]

Спасибо. Ну я почти так хотел сделать


 
Сергей М. ©   (2009-08-17 19:48) [144]

Почти как ?)


 
kostyl_kostyl   (2009-08-18 10:42) [145]

Ну в цикле коннекты делать... Только вот, что надо переопределить ErrorCheck я бы никогда не догадался.


 
Сергей М. ©   (2009-08-18 12:47) [146]


> Ну в цикле коннекты делать


Не только коннекты, но и приемы и передачи.


> надо переопределить ErrorCheck


Можно и не переопределять. Но тогда Connected = True ни в жисть не дождешься, хотя коннект и будет установлен)


 
kostyl_kostyl   (2009-08-19 10:39) [147]


> Но тогда Connected = True ни в жисть не дождешься, хотя
> коннект и будет установлен)

Ну я не знаю нюансов работы этих компонентов и не сильно понимаю строки
(rc = SOCKET_ERROR)


 
Сергей М. ©   (2009-08-19 10:45) [148]

"Нюансов" работы любых сетевых компонентов предостаточно.
Так что в любом случае придется в них вникать, если хочешь сотворить "безглючный" сетевой продукт.


 
Anatoly Podgoretsky ©   (2009-08-19 11:55) [149]

Без изучения основ ничего хорошего не будет, а с основами уже не важно какие компоненты или АПИ


 
kostyl_kostyl   (2009-08-20 10:22) [150]

А можете посоветовать хорошую книжку, но не сильно водяную по сетям?


 
Сергей М. ©   (2009-08-20 10:44) [151]

http://www.delphimaster.ru/books/978531800453/


 
kostyl_kostyl   (2009-08-20 13:25) [152]


> Сергей М. ©   (20.08.09 10:44) [151]

спасибо, уже качнул себе.


 
kostyl_kostyl   (2009-08-21 14:07) [153]


> Ты лучше сюда отпишись - не одному мне любопытно)

Пока что не получается, опыта маловато для такой статьи.
Могу предложить почитать другую http://itdumka.com.ua/index.php?cmd=shownode&node=5


 
Сергей М. ©   (2009-08-21 14:45) [154]


> почитать другую


"Много букаф, ниасилил"
)


 
kostyl_kostyl   (2009-08-21 16:39) [155]


> "Много букаф, ниасилил"

я думаю дописать продолжение по поводу "Как ограничить пагубное влияние `чужих` методов кодирования на свои", там, наверно, будет еще больше букаф...



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

Форум: "Начинающим";
Текущий архив: 2009.10.25;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.79 MB
Время: 0.055 c
2-1251782328
Sw
2009-09-01 09:18
2009.10.25
проверка готовности диска А и копирование на дискету


3-1228725725
amadey_motzart
2008-12-08 11:42
2009.10.25
ADOQuery


15-1251059406
Юрий
2009-08-24 00:30
2009.10.25
С днем рождения ! 24 августа 2009 понедельник


1-1221634382
Sashka
2008-09-17 10:53
2009.10.25
Последовательность идентификации и устранения ошибки


2-1251091182
Interesting
2009-08-24 09:19
2009.10.25
Как возвести число в степень?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский