Для решения, использующего 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();
В вашем коде есть предположение, которое может быть неверным. Передав 10.0.0.12 в connect
, вы настраиваете своего клиента на прием только входящих дейтаграмм с исходным IP-адресом 10.0.0.12. Но ничто на вашем сервере не гарантирует, что IP-адрес источника равен 10.0.0.12 или что IP-адрес источника будет совпадать с адресом назначения соответствующего запроса.
Рассмотрим:
10.0.0.12
, а ответ получен с другого IP-адреса. Короткая версия решения не должна использовать connect
для UDP, если сервер не гарантирует, что он всегда будет отправлять ответную дейтаграмму с IP-адресом источника, который совпадает с IP-адресом, на который собирается клиент connect
к. Ничто в вашей настройке не гарантирует этого.
Обычное решение состоит в том, чтобы никогда не связывать сокет UDP с подстановочным IP-адресом. Вместо этого привязайте сокет к определенному IP-адресу, который сервер будет использовать для связи со своими клиентами.