Закрытие сокета

Len– его первоначальная длина буфера.

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

Последний аргумент обеих функций – flags – может содержать комбинацию специальных опций. Нас будут интересовать две из них:

MSG_OOB - тот флаг сообщает ОС, что процесс хочет осуществить прием/передачу экстренных сообщений

MSG_PEEK - данный флаг может устанавливаться при вызове recv. При этом процесс получает возможность прочитать порцию данных, не удаляя ее из сокета, таким образом, что последующий вызов recv вновь вернет те же самые данные.

Функция send() возвращает количество переданных байт в случае успеха и -1 в случае неудачи. Код ошибки при этом устанавливается в errno.

В случае успеха функция recv() возвращает количество считанных байт, в случае неудачи –1.

Другая пара функций, которые могут использоваться при работе с сокетами с предварительно установленным соединением – это обычные read () и write(), в качестве дескриптора которым передается дескриптор сокета.

В качестве параметра этим функциям передается дескриптор сокета

Пара функций, которая может быть использована как с сокетами с установлением соединения, так и с сокетами без установления соединения:

#include <sys/types.h>

#include <sys/socket.h>

int sendto(int sockfd, const void *msg, int len, unsigned int flags, const struct sockaddr *to, int tolen);

int recvfrom(int sockfd, void *buf, int len, unsigned int flags, struct sockaddr *from, int *fromlen);

Первые 4 аргумента у них такие же, как и у рассмотренных выше. В последних двух в функцию sendto() должны быть переданы указатель на структуру, содержащую адрес получателя, и ее размер, а функция recvfrom() в них возвращает соответственно указатель на структуру с адресом отправителя и ее реальный размер. Перед вызовом recvfrom() параметр fromlenдолжен быть установлен равным первоначальному размеру структуры from. Здесь, как и в функции accept, если нас не интересует адрес отправителя, в качестве from можно передать NULL.

Если процесс закончил прием либо передачу данных, ему следует закрыть соединение. Это можно сделать с помощью функции shutdown.

#include <sys/types.h>

#include <sys/socket.h>

int shutdown (int sockfd, int mode);

mode - Целое число, которое определяет, какую режим закрытия соединения.

Если mode=0, сокет закрывается для чтения, при этом все дальнейшие попытки чтения будут возвращать end-of-file.

Если mode=1, то сокет закрывается для записи, и дальнейшие попытки передать данные вернут ошибку (-1).

Если mode=2, то сокет закрывается и для чтения, и для записи.

В принципе, для закрытия сокета можно было бы воспользоваться просто функцией close, но тут есть одно отличие. Если используемый для соединения протокол гарантирует доставку данных (тип сокета – виртуальный канал), то вызов close будет блокирован до тех пор, пока система будет пытаться доставить все данные, находящиеся «в пути», в то время как вызов shutdown извещает систему о том, что эти данные уже не нужны и можно не предпринимать попыток их доставить.

В случае успеха функция возвращает 0, в случае неудачи –1


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: