Формирование адреса ответа в сервере без установления логического соединения

Опубликовано в Технологии > Серверные технологии

В интерфейсе сокетов предусмотрено два способа задания адреса удаленной оконечной точки. В главах 6 и 7 описано, как использовать в клиентах функцию connect для задания адреса сервера. После вызова клиентом функции connect он может применить функцию send (или write) для передачи данных, поскольку внутренняя структура данных сокета содержит не только адрес удаленной оконечной точки, но и адрес локальной оконечной точки. Однако в сервере без установления логического соединения нельзя использовать функцию connect, поскольку это приведет к ограничению применения сокета для связи с другими удаленными хостами и портами (кроме того хоста и порта, которые указаны в вызове этой функции), поэтому в сервере нельзя будет использовать сокет для получения дейтаграммы от произвольных клиентов. Таким образом, в сервере без установления логического соединения применяется неподключенный сокет. В нем явно формируются адреса ответов и используется вызов функции сокетов sendto для указания и передаваемой дейтаграммы, и адреса, по которому она должна быть передана. Вызов функции sendto имеет следующую форму:

retcode = sendto(s, message, len, flags, toaddr, toaddrlen); 

Здесь s — неподключенный сокет, message — адрес буфера, содержащего передаваемые данные, len — число байтов в буфере, flags — опции отладки или управления, toaddr — указатель на структуру sockaddrjLn, содержащую адрес оконечной точки, по которому должно быть отправлено сообщение, и toaddrlen — целое число, обозначающее длину структуры адреса. Астро7 - гадание на картах таро смотри здесь.

Функции сокетов предоставляют удобный способ получения адреса клиента в серверах без установления логического соединения: сервер получает адрес для ответа из адреса источника, находящегося в запросе. По существу, интерфейс сокетов предоставляет вызов, который может применяться для получения адреса отправителя вместе с очередной поступающей дейтаграммой. Этот вызов (recvf rom) принимает два параметра с указанием двух буферов. Система помещает поступающую дейтаграмму в один буфер, а адрес отправителя — в другой. Вызов функции recvf rom имеет следующую форму:

retcode = recvfrom(s, buf, len, flags, from, fromlen); 

8.19. Формирование адреса ответа в сервере без установления логического соединения

Здесь параметр s указывает используемый сокет, buf обозначает буфер, в который система должна поместить очередную дейтаграмму, len определяет место, доступное в буфере, flags управляет действиями функции в особых случаях (например, указывает, нужно ли выполнять предварительный просмотр данных без извлечения их из сокета), from указывает второй буфер, в который система должна поместить адрес источника, a fromlen указывает адрес целочисленной переменной. Первоначально целочисленная переменная, на которую указывает параметр fromlen, определяет длину буфера from; после возврата управления функцией recvfrom он содержит длину адреса источника (т.е. длину элемента данных в буфере from). При формировании ответа сервер использует адрес, записанный функцией recvfrom в буфер from во время получения запроса.