Прием и передача данных

Подтверждение соединения

#include <sys/types.h>

#include <sys/socket.h>

int accept (int sockfd, struct sockaddr *addr, int *addrlen);

sockfd – дескриптор сокета

addr – указатель на структуру, в которой возвращается адрес клиентского сокета, с которым установлено соединение (если адрес клиента не интересует, передается NULL).

addrlen – возвращается реальная длина этой структуры максимальный размер очереди запросов на соединение.

Возвращает дескриптор нового сокета, соединенного с сокетом клиентского процесса.

Этот вызов применяется сервером для удовлетворения поступившего клиентского запроса на соединение с сокетом, который сервер к тому моменту уже прослушивает (т.е. предварительно была вызвана функция listen). Accept извлекает первый запрос из очереди и устанавливает с ним соединение. Если к моменту вызова accept никаких запросов на соединение с данным сокетом еще не поступало, процесс, вызвавший accept, блокируется до поступления запросов. Когда запрос поступает и соединение устанавливается, accept возвращает дескриптор нового сокета, соединенного с сокетом клиентского процесса. Через этот новый сокет и осуществляется обмен данными, в то время как старый сокет продолжает обрабатывать другие поступающие запросы на соединение (напомним, что именно первоначально созданный сокет связан с адресом, известным клиентам, поэтому все клиенты могут слать запросы только на соединение с этим сокетом). Это позволяет процессу-серверу поддерживать несколько соединений одновременно. Обычно это реализуется путем порождения для каждого установленного соединения отдельного процесса-потомка, который занимается собственно обменом данными только с этим конкретным клиентом, в то время как процесс-родитель продолжает прослушивать первоначальный сокет и порождать новые соединения. Во втором параметре передается указатель на структуру, в которой возвращается адрес клиентского сокета, с которым установлено соединение, а в третьем параметре возвращается реальная длина этой структуры. Благодаря этому сервер всегда знает, куда ему в случае надобности следует послать ответное сообщение. Если адрес клиента нас не интересует, в качестве второго аргумента можно передать NULL.

Собственно для приема и передачи данных через сокет используются три пары функций.

#include <sys/types.h>

#include <sys/socket.h>

int send(int sockfd, const void *msg, int len, unsigned int flags);

int recv(int sockfd, void *buf, int len, unsigned int flags);

Аргументы функций:

sockfd – дескриптор сокета, через который передаются данные

Для send:

len – длина сообщения

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

Для recv:


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



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