#c #sockets #server #client
#c #сокеты #сервер #клиент
Вопрос:
При программировании сокетов связь между клиентом и сервером.
когда клиент отправляет сообщение на сервер.
- Может ли сервер знать или определять имя хоста клиента?
- Должен ли он быть передан клиентом вручную?
- Обычный способ передачи сообщения на сервер от клиента
write(fd, clientMessage, sizeof(clientMessage));
.
Предположим, что есть некоторая информация заголовка, которая также должна быть разделена, например, имя хоста.
Должно ли это передаваться только так? Или есть какая-то лучшая альтернатива?
Комментарии:
1. Он знает IP, поэтому может запрашивать DNS.
2. .. предполагая, что соответствующий DNS-сервер доступен.
3. Если у вас есть подключенный сокет (например, сокет TCP), вы можете использовать
getpeername
функцию для получения «имени» (адреса) однорангового узла (другого конца соединения). Исходя из этого, вы можете использовать, например, (устаревшую)gethostbyaddr
функцию или современную альтернативуgetaddrinfo
.4. Способ передачи сообщения от клиента к серверу зависит от протокола связи. Если дополнительная информация является частью протокола, вы также должны отправить ее (каким-то образом).
read
write
Могут возникать частичные операции or, например, ваш код может захотеть записать 10 байт, но при первом вызове записывается только 5. В таком случае вам придется повторитьwrite
вызов с сохранением данных.5. @Someprogrammerdude » … или современная альтернатива getaddrinfo » — вы имели в виду
getnameinfo()
вместо этого.getaddrinfo()
преобразует строку IP / hostname в двоичный IP-адрес.getnameinfo()
преобразует двоичный IP-адрес в строку имени хоста.
Ответ №1:
Может ли сервер знать или определять имя хоста клиента?
Нет. Сервер имеет только IP-адрес клиента. Хотя он может попробовать обратный поиск DNS, информация, возвращаемая этим, ненадежна, т. Е. В первую очередь может отсутствовать настройка записи DNS PTR, или запись PTR может просто требовать произвольного сопоставления между IP и именем хоста, например, утверждения о том, что google.com .
Должен ли он быть передан клиентом вручную?
В TCP нет автоматического способа сделать это. Но, как и в случае с записью PTR, информация ненадежна, поскольку клиент может претендовать на что угодно.
Обычный способ передачи сообщения на сервер от клиента — write(fd, ClientMessage, sizeof(ClientMessage)); . … Это должно быть передано только так…
Не имеет значения, как оно передается. Все, что имеет значение, — это то, что клиент и сервер договариваются об одном и том же, чтобы сервер действительно мог извлекать информацию из данных.