К списку форумов К списку вопросов
Сокеты в Delphi
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())...

К списку вопросов на форуме Программирование

>>