Как получить сообщение только от желаемого клиента, если я знаю, что этот клиент был подключен к моему серверу?
Вы не можете сделать это с сокетом дейтаграммы в *Семейство 1005 * или AF_INET6
, если нежелательные клиенты не заблокированы на более низком уровне, например через брандмауэр.По крайней мере, если вы не хотите продолжать получать сообщения от желаемых клиентов после того, как пришло одно от нежелательного клиента.Сетевой драйвер ставит в очередь дейтаграммы для вас, и вам нужно обрабатывать их по порядку, где C API для «обработки» дейтаграммы должен получить ее через один из нескольких системных вызовов, которые служат этой цели, например recvfrom()
.
Вы можете различать сообщения после их получения, например, отбрасывая сообщения от нежелательных клиентов.Тем не менее, он имеет ограниченное, специальное назначение для извлечения данных сообщения без его удаления из очереди, как обеспечивает флаг MSG_PEEK
для recvfrom()
.В частности, это не соответствует вашей заявленной цели - вам все равно нужно будет получать каждое сообщение посредством последующего вызова, который не использует MSG_PEEK
.Вместо этого я предлагаю просто прочитать данные с помощью recvfrom()
, проверить адрес, чтобы определить, интересует ли его клиент, и обработать его соответствующим образом.
Если вы хотите обрабатывать несколько клиентов одновременновремя, то у вас есть несколько альтернатив.Относительно простым является наличие функции, возможно, выполняющейся в выделенном потоке, которая принимает все входящие сообщения и отправляет их соответствующим образом в соответствии с их исходными адресами.Другой альтернативой является открытие нового сокета (дейтаграммы) для каждого клиента, каждый на своем собственном порту, и настройка протокола, с помощью которого вы сообщаете каждому клиенту, какой порт использовать после первого контакта.Дейтаграммы от неожиданных клиентов на этих дополнительных портах будут ошибочными и поэтому безопасными для отклонения.
Конечно, последний из них является приближением к протоколу, ориентированному на соединение.Если вам это кажется привлекательным, то, возможно, вам следует смотреть на потоковые сокеты, а не на дейтаграммы.Это не только обеспечит вам особую клиентскую специфику, но и обеспечит надежную и гарантированную связь по порядку.