![]() |
![]() |
jediknight 06.04.2004 - 22:21 | как в Delphi организовать асинхронный режим сокетов с помощью компоненты TIdTCPClient? |
jediknight 1 - 07.04.2004 - 08:17 | . |
jediknight 2 - 07.04.2004 - 15:33 | че никто не знает? |
OF 3 - 07.04.2004 - 16:04 | Что есть в твоем понимании асинхронный режим? Лучше скажи, что хочешь сделать.. |
jediknight 4 - 07.04.2004 - 20:35 | Асинхронный режим: отправил пакет и забыл, прием пакетов по событию (например OnRead как в TClientSocket). Синхронный режим - блокирующий, после отправки пакета, клиент ждет ответа от сервера. Дело в том что в моем случае сервер может присылать пакеты, не являющиеся ответами. Если организовать цикл ожидания таких пакетов, то нет возможности отправлять свои пакеты! |
VaS 5 - 08.04.2004 - 15:16 |
Очень глубоко копать не стал, но такое впечатление, что с TIdTCPClient - никак. Напиши без компонентов. . Создаем сокет, соеденяемся: . const WM_SOCKET = WM_USER + 1; var Server: TSockAddrIn; begin S := socket(AF_INET, SOCK_STREAM, 0); if S = INVALID_SOCKET then Exit; if WSAAsyncSelect(S, Handle, WM_SOCKET, FD_CONNECT or FD_READ or FD_WRITE) = SOCKET_ERROR then begin closesocket(S); Exit; end; Server.sin_family := AF_INET; Server.sin_port := htons(80); Server.sin_addr.S_addr := inet_addr('127.0.0.1'); if connect(S, Server, sizeof(Server)) = SOCKET_ERROR then begin closesocket(S); Exit; end; end; . Ждем сообщений: . procedure TForm1.OnWMSocket(var Msg: TMessage); {message WM_SOCKET}; var I: Integer; begin case Msg.LParamLo of FD_CONNECT: //законнектились FD_READ: //есть что получать FD_WRITE: //можно посылать, пока send() не вернет WSAEWOULDBLOCK, потом снова ждем это сообщение end; end; . Или создай нить и жди там Event (см. WSAEventSelect())... |