![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
TspClient и TspServever [D7, XP]
kostyl_kostyl © (2009-08-12 12:38:00)Добрый день. Прошу показать пример обмена сообщениями сервера и клиента с помощью этих компонентов. У меня не выходит.
Я пишу:
procedure TForm1.TcpServer1Accept(Sender: TObject;
ClientSocket: TCustomIpClient);
begin
TcpServer1.Sendln('Ответ');
end;
//-----
if TcpClient.Connect then
begin
TcpClient.Sendln('Запрос');
Response := TcpClient.Receiveln;
ShowMessage(Response);
end
else
ShowMessage('Нет ответа');
TcpClient.Disconnect;
В лучшем случае выдает пустую строку. В худшем зависает на Response := TcpClient.Receiveln;. Помогите разобраться.
Заранее благодарю.
kostyl_kostyl (2009-08-17 12:12:00) [21]Да, я действительно не знаю принципов работы серверов и клиентов через TCP/IP. Знаю там, запрос - ответ, и все. Это мне урок. Дык мне просто полсать запрос на OnConnect клиента и не париться с циклами этими? Или как?
Anatoly Podgoretsky (2009-08-17 11:50:00) [22]> kostyl_kostyl (14.08.2009 17:51:04) [124]
Ты похоже просто не понимаешь ни принципы работы ассинхронной работы и что важнее принципы работы серверов и клиентов через TCP/IP. Это протокол с акцептированием, без акцептирования рвутся только сетевые черви.
Anatoly Podgoretsky (2009-08-17 11:48:00) [23]> kostyl_kostyl (14.08.2009 17:51:04) [124]
Это неверный алгоритм, протим принципов работы ассинхронных компонент, до Accept не надо ничего посылать, а то тебя быстро в хакеры зачислят файрволы и возможно на заметку возьмут администраторы.
kostyl_kostyl (2009-08-17 11:23:00) [24]Наверно проще будет написать обертку для таких случаев, чтобы в следующий раз не париться...
Сергей М. (2009-08-17 11:07:00) [25]Всенепременно)
kostyl_kostyl (2009-08-17 11:04:00) [26]Я так понял мне надо еще проверять WSAEWOULDBLOCK кроме WSAEALREADY?
kostyl_kostyl (2009-08-15 11:36:00) [27]Спасибо.
Сергей М. (2009-08-15 01:07:00) [28]
> если в OnError ошибка=WSAE NOTCONN, кручусь дальше
Справка гласит:
For a nonblocking socket, until the connection attempt completes all subsequent calls to connect on the same socket will fail with the error code WSAE ALREADY.
Зачем нести отсебячину ?
Сергей М. (2009-08-15 01:00:00) [29]
> kostyl_kostyl (14.08.09 14:52) [118]
А ты не пробовал справкупочитать ?
В ней ВСЕ написано - какие коды отказов ждать от той или иной ф-ци при тех или иных условиях ..
У меня, знаешь ли, нет великого желания цитировать ее здесь, справку ту самую.
> асинхронные режим - жестокая штука
Да уж)
Эт тебе не Пых-Пых развратный: вызвал какую-нть хрень - и жди результата, бо обязательно тут же будет)
> Как узнать что соединение установлено?
Вызывай повторно Open.. И следи ВНИМАТЕЛЬНО за OnError и OnConnect.
kostyl_kostyl (2009-08-14 23:54:00) [30]Ха. А я про клиент.
Anatoly Podgoretsky (2009-08-14 20:11:00) [31]> kostyl_kostyl (14.08.2009 17:51:04) [124]
Вопрос был другой, а для этого вопроса OnError, но при нормальном коннекте OnError не будет. Механизм в сильном приближение такой
OnListen > OnAccept|OnError (выход) > работа с сокетом > OnDisconnect
И про что ты сейчас говоришь про сервер или про клиента, я про сервер.
kostyl_kostyl (2009-08-14 17:51:00) [32]
> Anatoly Podgoretsky © (14.08.09 17:45) [123]
>
> OnAccept
ааа... Ну мне надо тоже учитывать таймут коннекта, поэтому я отсылаю запрос на коннект, а потом вхожу в цилк и в нем посылаю запрос; и если в OnError ошибка=WSAENOTCONN, кручусь дальше, пока таймаут не сработает или ошибки WSAENOTCONN не будет. Нормальны вариант?
Anatoly Podgoretsky (2009-08-14 17:45:00) [33]OnAccept
kostyl_kostyl (2009-08-14 17:40:00) [34]есть, OnError....
kostyl_kostyl (2009-08-14 16:33:00) [35]а, я понял сервер ждет данных, которые отослали до соединения. Как узнать что соединение установлено? Если оно не установлено, то к примеру по Сергей М. © (13.08.09 16:10) [97]в вайл не зайдет программа? Есть событие какое-то?
kostyl_kostyl (2009-08-14 16:19:00) [36]блин, асинхронные режим - жестокая штука, ни какой однозначности. Теперь сервер не ловит запросов...
kostyl_kostyl (2009-08-14 15:05:00) [37]или как сервер должен реагировать? Я посылаю запрос, на сервере генерируется акцепт и сервер зависает на РесивБуфер.
kostyl_kostyl (2009-08-14 14:52:00) [38]Я так понял, что мне еще надо добавить:
f (SocketError <> WSAEWOULDBLOCK) and
(SocketError <> WSAENOTCONN) then
TTCPClient(Sender).Disconnect;
Сергей М. (2009-08-14 12:40:00) [39]
> например в ОтЕррор может стать известно
Угу.
> у меня маленькая
Не беда)
Тренируй ее, культивируй - и вырастет большая-пребольшая)
kostyl_kostyl (2009-08-14 12:36:00) [40]
> станет известно позже.
Ага, я понял, например в ОтЕррор может стать известно.
> Ты лучше сюда отпишись - не одному мне любопытно
Ок, как будет готова, обязательно сюда отпишу.
ЗЫ: у меня маленькая посещаемость =)