Как создать TCP-соединение без слушателя? - PullRequest
2 голосов
/ 13 января 2020

В настоящее время я работаю над сетевой программой C ++, использующей Winsock 2, это программа для чата без сервера между двумя компьютерами. Было бы удобно, если бы ни один из пользователей не был вынужден запускать серверную программу, у которой есть прослушиватель, это заставляет их переносить вперед. Это, конечно, потребовало бы, чтобы они оба вводили IP друг друга, но это нормально. Есть ли способ создать TCP-соединение, запустив одну и ту же клиентскую программу на двух разных компьютерах, используя один и тот же порт и каждый вводя IP-адрес другого компьютера без необходимости перенаправлять порт?

Ответы [ 3 ]

2 голосов
/ 22 января 2020

Хотя вам нужно будет позвонить bind, чтобы разрешить другому компьютеру подключаться к этому порту, вам не нужно звонить accept.

Пока оба процесса вызвали bind на принимающем порту, а затем, предполагая, что адрес sin инициализирован для соответствующего пункта назначения, каждый процесс может симметрично соединяться друг с другом, используя al oop, который выглядит следующим образом:

  while (connect(s, sin, slen) < 0) {
      if (errno == ECONNREFUSED) continue;
      perror("connect");
      _exit(0);
  }

Это случай "одновременного открытия" на диаграмме конечного автомата TCP. Каждая сторона отправляет SYN одновременно, поэтому каждая сторона отвечает SYN / ACK. После того, как каждая сторона отправляет ACK для завершения трехстороннего рукопожатия, обе стороны переходят в состояние ESTABLISHED.

Try It Online не поддерживает потоки или доступ к обратной петле, но позволяет мне удобно представить полный пример кодирования.

0 голосов
/ 13 января 2020

В TCP одна сторона должна позвонить bind(), listen() и accept(), а другая сторона должна позвонить connect(). Обойти это невозможно, так работает TCP.

Если слушатель находится за NAT / Proxy, он должен использовать переадресацию портов по мере необходимости.

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

0 голосов
/ 13 января 2020

Если я правильно понимаю вашу задачу: (2 домашних компьютера в разных сетях, без "белых" ip-адресов; компьютеры, подключенные к inte rnet через провайдеров).

Ответ: Вы не можете , Через UDP вы тоже не можете.

Вам нужно что-то с ip-адресом, доступное из внешних сетей. Это называется сервер (или домашний компьютер) с «белым» ip-адресом. И это «что-то» должно получать ваши TCP-соединения.

...