Форум: "Начинающим";
Текущий архив: 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