как отличить, если клиент использует TCP или UDP со стороны сервера - PullRequest
8 голосов
/ 18 сентября 2009

Я пишу простую клиент-серверную программу.

Клиент отправляет некоторые сообщения на сервер, используя UDP или TCP. Сервер должен поддерживать как UDP, так и TCP.

Если клиент отправляет сообщение с использованием UDP, последовательность вызовов методов в клиенте равна socket(),bind(),sendto(),recvfrom(),close(), а на сервере - socket(),bind(),sendto(),recvfrom(),close().

Если он использует TCP, последовательность вызова на сервере socket(),bind(),listen(),accept(),send(),recv(),close(). и что в клиенте есть socket(),bind(),connect(),send(),recv(),close()

В моей программе пользователю / клиенту в начале предоставляется выбор, чтобы выбрать, что он хочет использовать UDP или TCP. Итак, моя главная проблема заключается в том, как я могу узнать или различить на стороне сервера, если клиент отправляет сообщение с использованием TCP или UDP. Если он использует TCP, я должен вызвать listen (), accept (), send (), recv () и если он использует UDP, я не вызываю listen (), accept (), но вызываю sendto () и recvfrom ().

Итак, как я могу различить / узнать это в начале, чтобы я мог делать соответствующие вызовы функций.

Спасибо.

Ответы [ 4 ]

17 голосов
/ 18 сентября 2009

До того, как пакет дойдет до вас, вы не знаете, является ли он UDP или TCP.

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

Как только вы это сделали, вы просто знаете, каким образом он пришел через сокет, через который вы получили пакет.

6 голосов
/ 18 сентября 2009

При создании сокета вы передаете тип - SOCK_STREAM (TCP) или SOCK_DGRAM (UDP)

Таким образом, два вида трафика будут находиться в двух разных сокетах.

2 голосов
/ 16 мая 2018

Как отметил Генри Труп, сокет IP определяется как

(транспорт, интерфейс, порт).

(UDP, 127.0.0.1, 80) - это не тот же сокет IP, что и (TCP, 127.0.0.1, 80), поэтому вы можете безопасно связать их обоих и прослушивать входящий трафик.

1 голос
/ 18 сентября 2009

просто дайте сокету TCP прослушивать порт X и выполнять соединения UDP через порт Y

...