Как к UDP отправляют и получают на том же порте?

Инструмент импорта и экспорта данных SQL Server, FTW!

Пуск -> Программы -> Microsoft SQL Server -> Импорт и экспорт данных

Пример запроса:

select *
from (
select 'Row 1' as [row], 'Commas, commas everywhere,' as [commas], 'line 1
line 2
line 3' as [linebreaks]

union all 

select 'Row 2' as [row], 'Nor any drop to drink,' as [commas], 'line 4
line 5
line 6' as [data]
) a

Выход CSV:

"row","commas","linebreaks"
"Row 1","Commas, commas everywhere,","line 1
line 2
line 3"
"Row 2","Nor any drop to drink,","line 4
line 5
line 6"

Отказ от ответственности: Возможно, вам придется проявить творческий подход с двойными кавычками в данных. Удачи!

10
задан cedgriss 28 October 2009 в 22:54
поделиться

2 ответа

Система состоит из нескольких узлов прослушивание того же порта (другой ip адрес). Система [A] отправляет дейтаграмму в Система [B]. Система [B] асинхронно отвечает и отправляет дейтаграммы обратно в [A] все используют один и тот же порт. Даже если [B] идентифицирует порт [A], [A] не является прослушивание этого порта

Я не уверен, что понимаю фразу «все используют один и тот же порт» в этом предложении. Если A отправляет датаграмму B, B сразу же узнает IP-адрес и порт A (быстрая проверка документации вашей библиотеки показывает, что OnRawData имеет параметр struct sockaddr * sa , если вы приведете его к sockaddr_in * вы сможете извлечь пару IP: порт). Вы можете использовать этот IP: порт для отправки дейтаграмм, и A будет их получать. A не «слушает» этот порт в том смысле, что он не вызывал listen () для сокета, но поскольку A владеет сокетом, который привязан к этому порту (явно ли путем вызова bind () или назначен случайный порт с помощью ОС) он получит данные.

Теперь, если вы хотите, чтобы ВСЕ ваши коммуникации между узлами проходили через ваш фиксированный порт, вы можете это сделать. Вам просто нужно отправить все свои дейтаграммы через «слушающий» сокет. Если каждый узел «слушает» один и тот же порт, это означает, что каждый узел владеет сокетом, привязанным к этому порту. Если вы хотите, чтобы дейтаграммы, отправленные из A в B, появлялись из этого фиксированного порта, вы должны отправлять их через этот сокет. Я предполагаю, почему bind () не работает для вашего отправляющего сокета - A имеет сокет, привязанный к порту X, затем вы создаете другой сокет и пытаетесь привязать его к тому же порту X, bind () не работает, так как порт уже занято (и вы не проверяете ошибки :), а затем ОС назначает случайный свободный порт выше 1024.

Примечание 1: я везде использую "прослушивание" в кавычках, потому что концепция не очень ясна в контекст сокетов UDP. После того, как вы создали сокет и привязали его к порту, либо явно вызывая bind (), либо отправляя данные и позволяя ОС привязать их к порту, вы можете получать данные отовсюду через него. Вызовы listen () или accept () не требуются.

Примечание 2: вы говорите, что UdpSocket :: Open () вызывает connect (), но это не имеет особого смысла - connect () мало что делает для сокетов UDP - он просто устанавливает адрес по умолчанию, поэтому вы можете использовать send () вместо sendto () и не указывать адрес при каждой отправке.

Надеюсь, это проясняет ситуацию.


Edit to address OP's comment: I've never used this library but according their UdpSocket documentation there are 4 overloads of the Bind() method and every single one of them accepts port in some way. None of them works for you?
10
ответ дан 3 December 2019 в 23:13
поделиться

Двунаправленный канал связи всегда включает в себя двух участников: на стороне сервера и на стороне клиента.

Клиент ожидает связи с сервером через определенный порт: поэтому на сервере -side нужно привязать () к сокету.

На стороне клиента необходимо открыть сокет для сервера: на самом деле не имеет значения, какой сокет выбран (за исключением того, что он должен быть бесплатным).

Другими словами, не нужно попробуйте указать сокет на стороне клиента: стек сетевого протокола назначит его вашему клиенту.

4
ответ дан 3 December 2019 в 23:13
поделиться
Другие вопросы по тегам:

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