Переподключите клиента к другому сокету

У меня есть мобильный клиент, который будет подключаться через 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;

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


person DeCoder    schedule 13.05.2019    source источник


Ответы (1)


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

person Remy Lebeau    schedule 14.05.2019
comment
Спасибо, Реми, я так и думал, просто хотел подтвердить. - person DeCoder; 14.05.2019