2013-02-15 2 views
0

Я спрашиваю его в практическом смысле. В TCP, accept() предоставит нам новый сокет для каждого connect(). Он позволяет использовать несколько одновременных сообщений только с одним портом сервера.Почему нет «accept()» для UDP?

Вопросы, почему у нас нет такого удобства в UDP? Не говорите мне, что UDP является бесконтактным, следовательно ... Логически, accept() не имеет к этому никакого отношения (в противном случае базовый IP без установления соединения).

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

Благодарим вас за понимание.

+1

'accept()' имеет ** все **, что связано с тем, что TCP имеет соединения. Весь смысл 'accept()' заключается в том, чтобы получить поток, который содержит данные из ** только **, что соединение, в последовательности, без потери или дублирования. –

ответ

3

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

+0

А также потому, что каждая дейтаграмма UDP стоит одна, она не является частью потока данных. Так что, помимо чтения его из сокета, для выполнения не требуется никакой работы сокета. –

+0

+1 для «Вы получаете информацию о удаленных адресах с каждой входящей UDP-программой». Мне это было нужно. – jessicaraygun

Смежные вопросы