Использование UDP-сокетов для получения данных - PullRequest
2 голосов
/ 18 ноября 2010

Я пишу заявление, и я не понимаю суть.Я пытаюсь получить данные от конкретного клиента.В TCP-сокете accept возвращает вам номер fd, чтобы вы могли общаться по этому номеру fd с конкретным клиентом.

В recvfrom ничто не может указывать на получение данных от этого клиента.Он получает данные от всех, кто отправил.Я пытаюсь решить эту проблему, но я не уверен, как это сделать.

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


Да, мой вопрос немного сложен.В основном я говорю:

recvfrom(sock, &client, sizeof(Client), MSG_WAITALL, (struct sockaddr *)&clientAddr2, &size);

Как можно сказать конкретному клиенту (скажем, клиент 2) прослушать в строке выше?(в сокетах TCP это делается по номеру fd, но как в сокете UDP?).

Ответы [ 3 ]

2 голосов
/ 18 ноября 2010

Принять не используется с UDP. Вы вызываете socket, вызываете bind для установления порта, вызываете sendto и recvfrom.

Боюсь, что не могу очень хорошо следовать вашему описанию, но надеюсь, что это поможет.

TCP и UDP являются разными и несовместимыми протоколами. Клиенты и серверы UDP общаются друг с другом, клиенты и серверы TCP общаются друг с другом. Гипотетически, вы можете использовать сокет RAW для связи с TCP с другой стороны, но вам потребуется полная реализация протокола TCP.

У UDP нет соединений. Если у вас есть понятие о разных клиентах, вы должны отсортировать их по данным, которые вы поместили в пакетах.

1 голос
/ 18 ноября 2010

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

Однако, это может быть необязательно.Сервер может проверить адрес, предоставленный с помощью вызова recvfrom (), связать его с соответствующим клиентом и обработать его (например, через рабочий поток) в соответствии с тем, какой клиент отправил его.

0 голосов
/ 18 ноября 2010

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

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

...