Перейти к содержимому
На этой странице

Сокеты

Все темы C++ Developer

Что такое сокет?

Сокет — это программный интерфейс, обеспечивающий обмен данными между компьютерами по сети. Сокеты используются для установления соединений, передачи и приёма данных по сети.

Основные виды сокетов:

  1. TCP-сокеты:

    • Обеспечивают надёжное, ориентированное на соединение общение.

    • TCP доставляет принятые байты приложению в порядке отправки и повторяет потерянные сегменты. При неустранимом сбое соединение может завершиться ошибкой; безусловной гарантии доставки или обработки удалённым приложением нет.

    • Используются для приложений, где важна надёжность (например, веб-серверы).

  2. UDP-сокеты:

    • Обеспечивают ненадёжное, без соединения общение.

    • Не гарантируют доставку данных или порядок их приёма.

    • Используются для приложений, где важна скорость и не критична потеря данных (например, видеостриминг).

Пример использования сокетов в C++:

#include <iostream>
#include <cstring>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
int main() {
    int sock = socket(AF_INET, SOCK_STREAM, 0); // Создание TCP-сокета
    if (sock < 0) {
        std::cerr << "Socket creation error" << std::endl;
        return -1;
    }

    sockaddr_in serverAddress{};
    serverAddress.sin_family = AF_INET;
    serverAddress.sin_port = htons(8080);
    inet_pton(AF_INET, "127.0.0.1", &serverAddress.sin_addr);

    if (connect(sock, (struct sockaddr*)&serverAddress, sizeof(serverAddress)) < 0) {
        std::cerr << "Connection Failed" << std::endl;
        return -1;
    }

    const char* message = "Hello, server";
    send(sock, message, strlen(message), 0); // Отправка данных
    close(sock); // Закрытие сокета

    return 0;
}

Какие операции можно делать с сокетом?

С сокетами можно выполнять следующие основные операции:

  1. Создание сокета:

    • Создание нового сокета с помощью socket().
    int sock = socket(AF_INET, SOCK_STREAM, 0);
  2. Привязка сокета:

    • Привязка сокета к конкретному адресу и порту с помощью bind().
    bind(sock, (struct sockaddr*)&address, sizeof(address));
  3. Прослушивание (только для серверов):

    • Перевод сокета в режим ожидания входящих соединений с помощью listen().
    listen(sock, 3);
  4. Принятие соединения (только для серверов):

    • Принятие входящего соединения с помощью accept().
    int new_socket = accept(sock, (struct sockaddr*)&address, (socklen_t*)&addrlen);
  5. Установка соединения (только для клиентов):

    • Установка соединения с удалённым сокетом с помощью connect().
    connect(sock, (struct sockaddr*)&serverAddress, sizeof(serverAddress));
  6. Отправка данных:

    • Отправка данных через сокет с помощью send() (для TCP) или sendto() (для UDP).
    send(sock, message, strlen(message), 0);
  7. Приём данных:

    • Приём данных через сокет с помощью recv() (для TCP) или recvfrom() (для UDP).
    recv(sock, buffer, sizeof(buffer), 0);
  8. Закрытие сокета:

    • Закрытие сокета с помощью close().
    close(sock);

Какая информация нужна, чтобы создать сокет?

Для создания сокета необходимо указать следующую информацию:

  1. Адресное семейство:

    • Обычно используется AF_INET для IPv4 или AF_INET6 для IPv6.
    int domain = AF_INET;
  2. Тип сокета:

    • SOCK_STREAM для TCP (надёжное соединение).

    • SOCK_DGRAM для UDP (ненадёжное соединение).

    int type = SOCK_STREAM;
  3. Протокол:

    • Обычно задаётся значением 0, что позволяет системе выбрать протокол по умолчанию для указанного типа сокета.
    int protocol = 0;

Пример создания сокета:

int sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock < 0) {
    std::cerr << "Socket creation error" << std::endl;
}

Собеседования: C++

Смотри записи интервью, узнай, какие вопросы задают и как отвечают кандидаты.

Вопросы и ответы

Не нашли ответ? Напишите мне в чат. Я делаю Шпаргалку и сам отвечаю на сообщения. Расскажите, что не работает или чего вам не хватает. Может, смогу сразу взять это в работу.

Откуда взяты вопросы?

Из реальных собеседований. Основой подборки стал опыт Вадима Новосёлова: он проходил интервью и записывал вопросы. Подробнее о материалах.

Насколько эти вопросы актуальны?

Эти вопросы встречались нам на реальных собеседованиях в 2025 году. Мы регулярно проходим собеседования и пополняем подборку новыми вопросами. Основы профессии и ключевые технологии остаются востребованными годами, а детали конкретных инструментов и версий стоит сверять с текущей документацией.

На какой уровень рассчитана подборка?

Мы проходили собеседования на вакансии уровня Middle+, а иногда и на Senior-позиции. Вопросы из этих интервью вошли в подборку. Направления работы: C++-разработчик, Разработчик системного ПО. Глубина обсуждения зависит от вакансии: будь готов объяснить основную идею, привести практический пример и разобрать ограничения и альтернативы решения.

Этот вопрос точно будет на моём собеседовании?

Гарантии нет: набор вопросов зависит от компании, задач команды, уровня вакансии и самого интервьюера. Эти вопросы уже встречались на реальных собеседованиях, но на твоём интервью ту же тему могут проверить другой формулировкой, практической задачей или обсуждением твоего опыта. Используй подборку, чтобы разобраться в теме: объясняй идею своими словами, приводи примеры и готовься обсудить ограничения и альтернативы решения. Так будет проще ответить и на знакомый вопрос, и на неожиданные уточнения.