Сокет UDP не может получать ответы, когда в Linux используется функция подключения

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

var input = "ABC-PQ-EF=CDED-IJ=XY-JKLM";

var split = input.Split('-', '=');

int offset = 0;

var result = split
            .Take(split.Length - 1)
            .Select((part, index) => {
                offset += part.Length;
                return $"{part}{input[index + offset]}{split[index + 1]}";})
            .ToArray();
0
задан Jerry 19 January 2019 в 09:20
поделиться

1 ответ

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

Рассмотрим:

  1. Клиент подключается к 10.0.0.12:19998
  2. Клиент отправляет дейтаграмму 10.0.0.12:19998 с одним из его IP-адресов в качестве адреса источника. [115 ]
  3. Сервер получает запрос, отправленный на 10.0.0.12:19998.
  4. .
  5. Сервер формирует ответ на IP-адрес источника этой дейтаграммы и отправляет его.
  6. Сервер выбирает IP-адрес источника, отличный от 10.0.0.12, потому что он кажется «ближе» к месту назначения. IP-стек сервера не знает, что эта дейтаграмма в каком-то смысле является ответом на полученную дейтаграмму и поэтому не имеет смысла устанавливать IP-адрес источника на 10.0.0.12.
  7. Клиент отклоняет ответ, поскольку он подключен к 10.0.0.12, а ответ получен с другого IP-адреса.

Короткая версия решения не должна использовать connect для UDP, если сервер не гарантирует, что он всегда будет отправлять ответную дейтаграмму с IP-адресом источника, который совпадает с IP-адресом, на который собирается клиент connect к. Ничто в вашей настройке не гарантирует этого.

Обычное решение состоит в том, чтобы никогда не связывать сокет UDP с подстановочным IP-адресом. Вместо этого привязайте сокет к определенному IP-адресу, который сервер будет использовать для связи со своими клиентами.

0
ответ дан David Schwartz 19 January 2019 в 09:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: