`net .DialUDP` подключения `net .Read` получает свои собственные `net .Write` данные - PullRequest
0 голосов
/ 03 апреля 2020

У меня довольно сложная настройка «сервер-клиент», где сервер по сути действует как ретранслятор для определенных пакетов между двумя уникальными клиентами. Не волнуйтесь, я сделал диаграмму, но вот сводка.

Пакет начинается с сервера, переходит на ClientS, затем ClientS отправляет пакет в ответ, который затем сервер реле на ClientP. Затем при получении пакета ClientP отправляет другой пакет обратно на сервер, который затем, наконец, передает ClientS (предположительно).

Диаграмма A

enter image description here

Проблема (проверьте редактирование после)

Раздражает то, что это работает только до шага № 4. По какой-то причине, когда сервер выполняет окончательное net.Write для UDP-соединения, оно каким-то образом выбирается, но имеет собственный net.Read сервера с # 2 вместо net.Read с ClientS. Другая диаграмма, иллюстрирующая проблему.

Диаграмма B

enter image description here

Код

С точки зрения кода с сервера , Я делаю два net.DialUDP, каждый, чтобы установить соединение с двумя клиентами. После того, как это соединение "установлено", в каждом соединении будет ожидаться net.Read ожидание в каждом соединении.

В данный момент код немного повсюду, и я не хочу просто его сбрасывать все здесь. Однако вот функции для каждого шага в диаграммах и как я набираю соединения UDP. (очевидно, он не скомпилируется, но, может быть, этого достаточно, чтобы обнаружить что-то?)

clientSConn, err := net.DialUDP(udpNetwork, localClientSAddress, remoteClientSAddress)
clientSConn.Write(b []byte) (int, error) { … // <------- #1
clientSConn.Read(b []byte) (int, error) { …  // <------- #2
clientSConn.Write(b []byte) (int, error) { … // <------- #5 this byte[] is read by #2 ¯\_(ツ)_/¯

clientPConn, err := net.DialUDP(udpNetwork, localClientPAddress, remoteClientPAddress)
clientPConn.Write(b []byte) (int, error) { … // <------- #3
clientPConn.Read(b []byte) (int, error) { …  // <------- #4

Допущения / тесты

  • Когда я набираю номер с локального на удаленный адрес и делаю запись, данные могут только go на удаленный адрес, указанный для набора. То же самое с чтением, данные могут поступать только с удаленного адреса набранного соединения.
  • Я запустил этот проект с использованием net.Listen, и он дал мне гораздо более странные результаты. net.Dial в конце концов решил большинство моих начальных проблем. Может быть, я все еще не понимаю, в чем разница?
  • Я пытался net.ReadFrom и net.ReadFromUDP, но оба дали мне тот же результат, что и net.Read.
  • Я пытался net.WriteTo и net.WriteToUDP, но ни один из них не отправил никаких данных клиентам.

РЕДАКТИРОВАТЬ (РЕШЕНО!)

Оказалось, что проблемы были довольно очевидными и смущающими. # 10 Write не зацикливается на Read, он просто повторяет # 1 и # 2, так как соединение для # 1 и # 5 одинаково.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...