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

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.81 MB
Время: 0.035 c
15-1250750943
balepa
2009-08-20 10:49
2009.10.25
USB A to USB A (male/male) и Huawei ETS1200


2-1251206612
Дмитрий_
2009-08-25 17:23
2009.10.25
TStrngList.AddObject..?


15-1251061394
syte_ser78
2009-08-24 01:03
2009.10.25
программы как в сериале "Сеть"


15-1251178540
Andy BitOff
2009-08-25 09:35
2009.10.25
Что думают знатоки по поводу такой конфигурации?


2-1251882705
sanx
2009-09-02 13:11
2009.10.25
Получить от компилятора текущую дату в констатнту, как?