Переподключите клиента к другому сокету - PullRequest
0 голосов
/ 14 мая 2019

У меня есть мобильный клиент, который подключится через TCP к серверу. Я хотел бы установить брокерское соглашение, при котором клиент подключается к серверу через порт 12345; сервер аутентифицирует клиента и отправляет клиенту сокет на сервер, который обрабатывает потребности этого пользователя и сообщает клиенту о повторном подключении к полученному сокету. Поэтому вместо того, чтобы клиент оставался подключенным к 1.2.3.4:12345, теперь я хочу, чтобы клиент подключился к 1.2.3.4:23456.

.

Есть ли способ сделать это в протоколе TCP? Или мне нужно сделать пользовательское программирование на обеих сторонах соединения?

Используя TIdMappedPortTCP, я попробовал это:

procedure TForm3.idMapPortBeforeConnect(AContext: TIdContext);
begin
  if Pos(AContext.Binding.PeerIP,'192.168.0.21') > 0 then
    AContext.Binding.SetPeer('192.168.0.89',12345);
end;

Это успешно меняет одноранговый порт на нужный порт, но не говорит клиенту о необходимости повторного подключения. Таким образом, сопоставление портов все еще используется.

1 Ответ

1 голос
/ 14 мая 2019

Нет способа делать то, что вы хотите на уровне TCP. Как только соединение установлено, его конечные точки не могут быть изменены. Чтобы сделать то, что вы хотите, сервер должен отправить клиенту сообщение, сообщающее ему новый IP / порт, затем клиент должен создать новый сокет TCP и подключить его к этому IP / порту

...