powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Реализация сетевого приложения с использованием enet
1 сообщений из 1, страница 1 из 1
Реализация сетевого приложения с использованием enet
    #39719801
Amadeus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Помогите разобраться с enet. Приведу свой код реализации сети на примере небольшой программы, демонстрирующей создание сервера, подключение и отключение клиента и получение событий.

Структуры клиента и сервера:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
  TClient = record
    host: PEnetHost;
    addr: TEnetAddress;
    event: TEnetEvent;
    peer: PEnetPeer;
  end;

  TServer = record
    host: PEnetHost;
    addr: TEnetAddress;
    event: TEnetEvent;
  end;



Процедура запуска сервера:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
  server.addr.host := ENET_HOST_ANY;
  server.addr.port := 6112;

  server.host := enet_host_create(@server.addr, 2, 2, 0, 0);
  if (server.host = nil) then
    showMessage('Не удалось запустить сервер.')
  else begin
    showMessage('Сервер успешно запущен.');
    tmrServer.enabled := true;
  end;



Процедура подключения клиента:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
  client.host := enet_host_create(nil, 1, 2, 0, 0);

  if (client.host = nil) then
    showMessage('Ошибка при создании клиента.');

  enet_address_set_host(@client.addr, '192.168.0.2');
  client.addr.port := 6112;
  client.peer := enet_host_connect(client.host, @client.addr, 2, 0);

  if (client.peer = nil) then
    showMessage('Невозможно установить соединение с сервером.');

  if ((enet_host_service(client.host, @client.event, 1000) > 0) and
    (client.event.type_ = ENET_EVENT_TYPE_CONNECT)) then
    tmrClient.enabled := true
  else begin
    enet_peer_reset(client.peer);
    showMessage('Невозможно установить соединение с сервером.');
  end;



Серверный таймер:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
  if (enet_host_service(server.host, @server.event, 0) > 0) then begin
    case server.event.type_ of
      ENET_EVENT_TYPE_CONNECT: showMessage('Клиент подключился!');
      ENET_EVENT_TYPE_DISCONNECT: showMessage('Клиент отключился!');
      ENET_EVENT_TYPE_RECEIVE: receive(server.event);
    end;
  end;



Клиентский таймер:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
  if (enet_host_service(client.host, @client.event, 0) > 0) then begin
    case client.event.type_ of

      ENET_EVENT_TYPE_CONNECT: showMessage('Я подключился!');

      ENET_EVENT_TYPE_DISCONNECT: begin
      	showMessage('Я отключился!');
        enet_peer_reset(client.peer);
      end;

      ENET_EVENT_TYPE_RECEIVE: receive(client.event);
    end;
  end;



Проблема следующая. В процедуре подключения клиента есть такие строки:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
  if ((enet_host_service(client.host, @client.event, 1000) > 0) and
    (client.event.type_ = ENET_EVENT_TYPE_CONNECT)) then
    tmrClient.enabled := true
  else begin
    enet_peer_reset(client.peer);
    showMessage('Невозможно установить соединение с сервером.');
  end;



Из-за них всегда появляется сообщение "Невозможно установить соединение...", при том, если отключить эти строки и вынести активацию клиентского таймера выше, то соединение проходит успешно, и появляются сообщения, описанные в событиях "...CONNECT" клиента и сервера. Однако, в этом случае нет возможности отследить неудачное подключение, и при попытке подключиться к не запущенному серверу просто ничего не происходит.

Подскажите, если я что-то делаю неправильно.
...
Рейтинг: 0 / 0
1 сообщений из 1, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Реализация сетевого приложения с использованием enet
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]