====== Berkeley sockets ======
Сокет-интерфейс Беркли (Berkeley Sockets) - это API для сетевого программирования, который был разработан в Университете Калифорнии в Беркли. Он позволяет приложениям обмениваться данными через сети, используя различные протоколы, такие как TCP и UDP. Вот основные концепции и функции, которые тебе нужно знать.
**Сокет** - это абстракция, представляющая конечную точку связи. Сокеты бывают двух типов: потоковые (stream sockets) для TCP и дейтаграммные (datagram sockets) для UDP.
Пример использования:
1. **Создание сокета**: Для создания сокета используется функция ''socket()''. Она принимает три параметра: домен (например, ''AF_INET'' для IPv4), тип сокета (например, ''SOCK_STREAM'' для TCP) и протокол (обычно 0, что означает протокол по умолчанию для указанного типа сокета).
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
2. **Привязка сокета**: Функция ''bind()'' связывает сокет с конкретным адресом и портом. Это необходимо для серверных приложений.
struct sockaddr_in serv_addr;
serv_addr.sin_family = AF_INET
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = htons(8080);
bind(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr));
3. **Прослушивание и принятие соединений**: Серверные приложения используют функции ''listen()'' и ''accept()'' для ожидания и принятия входящих соединений.
listen(sockfd, 5);
int newsockfd = accept(sockfd, (struct sockaddr *)&cli_addr, &clilen);
4. **Соединение с сервером**: Клиентские приложения используют функцию ''connect()'' для установления соединения с сервером.
connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr));
5. **Отправка и получение данных**: Для отправки и получения данных используются функции ''send()'' и ''recv()'' для потоковых сокетов, ''sendto()'' и ''recvfrom()'' для дейтаграммных сокетов.
send(sockfd, "Hello, World!", 13, 0);
recv(sockfd, buffer, 256, 0);
6. **Закрытие сокета**: После завершения работы с сокетом его необходимо закрыть с помощью функции ''close()''.
close(sockfd);