У меня довольно сложная настройка «сервер-клиент», где сервер по сути действует как ретранслятор для определенных пакетов между двумя уникальными клиентами. Не волнуйтесь, я сделал диаграмму, но вот сводка.
Пакет начинается с сервера, переходит на ClientS
, затем ClientS
отправляет пакет в ответ, который затем сервер реле на ClientP
. Затем при получении пакета ClientP
отправляет другой пакет обратно на сервер, который затем, наконец, передает ClientS
(предположительно).
Диаграмма A
Проблема (проверьте редактирование после)
Раздражает то, что это работает только до шага № 4. По какой-то причине, когда сервер выполняет окончательное net.Write
для UDP-соединения, оно каким-то образом выбирается, но имеет собственный net.Read
сервера с # 2 вместо net.Read
с ClientS
. Другая диаграмма, иллюстрирующая проблему.
Диаграмма B
Код
С точки зрения кода с сервера , Я делаю два 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 одинаково.