====== 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);