---
title: Сокеты
seo:
  title: Сокеты — C++ Developer
  description: Тема «Сокеты» для собеседования C++ Developer. Что такое сокет? Какие операции можно делать с сокетом?
---

[Все темы C++ Developer](/c-developer)

## <strong>Что такое сокет?</strong> [#q-14bee738d69b81dcaf45dc2cb059e34d]

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

#### Основные виды сокетов&#58;

{/* prettier-ignore */}
1. <code>TCP&#45;сокеты</code>&#58;

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

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

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

1. <code>UDP&#45;сокеты</code>&#58;

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

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

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

#### Пример использования сокетов в C++&#58;

```cpp
#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;
}
```

:::note[Ссылки для изучения]

1. [Гайд начинающему сетевому программисту](https://habr.com/ru/articles/582370/)
   :::

---

## <strong>Какие операции можно делать с сокетом?</strong> [#q-14bee738d69b813583bdc2441363a43d]

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

{/* prettier-ignore */}
1. <strong>Создание сокета</strong>&#58;

    - Создание нового сокета с помощью <code>socket&#40;&#41;</code>.

    ```cpp
    int sock = socket(AF_INET, SOCK_STREAM, 0);
    ```

1. <strong>Привязка сокета</strong>&#58;

    - Привязка сокета к конкретному адресу и порту с помощью <code>bind&#40;&#41;</code>.

    ```cpp
    bind(sock, (struct sockaddr*)&address, sizeof(address));
    ```

1. <strong>Прослушивание (только для серверов)</strong>&#58;

    - Перевод сокета в режим ожидания входящих соединений с помощью <code>listen&#40;&#41;</code>.

    ```cpp
    listen(sock, 3);
    ```

1. <strong>Принятие соединения (только для серверов)</strong>&#58;

    - Принятие входящего соединения с помощью <code>accept&#40;&#41;</code>.

    ```cpp
    int new_socket = accept(sock, (struct sockaddr*)&address, (socklen_t*)&addrlen);
    ```

1. <strong>Установка соединения (только для клиентов)</strong>&#58;

    - Установка соединения с удалённым сокетом с помощью <code>connect&#40;&#41;</code>.

    ```cpp
    connect(sock, (struct sockaddr*)&serverAddress, sizeof(serverAddress));
    ```

1. <strong>Отправка данных</strong>&#58;

    - Отправка данных через сокет с помощью <code>send&#40;&#41;</code> (для TCP) или <code>sendto&#40;&#41;</code> (для UDP).

    ```cpp
    send(sock, message, strlen(message), 0);
    ```

1. <strong>Приём данных</strong>&#58;

    - Приём данных через сокет с помощью <code>recv&#40;&#41;</code> (для TCP) или <code>recvfrom&#40;&#41;</code> (для UDP).

    ```cpp
    recv(sock, buffer, sizeof(buffer), 0);
    ```

1. <strong>Закрытие сокета</strong>&#58;

    - Закрытие сокета с помощью <code>close&#40;&#41;</code>.

    ```cpp
    close(sock);
    ```

:::note[Ссылки для изучения]

1. [Гайд начинающему сетевому программисту](https://habr.com/ru/articles/582370/)
   :::

---

## <strong>Какая информация нужна, чтобы создать сокет?</strong> [#q-14bee738d69b81cfaeb0c07fa922a631]

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

{/* prettier-ignore */}
1. <strong>Адресное семейство</strong>&#58;

    - Обычно используется <code>AF&#95;INET</code> для <code>IPv4</code> или <code>AF&#95;INET6</code> для <code>IPv6</code>.

    ```cpp
    int domain = AF_INET;
    ```

1. <strong>Тип сокета</strong>&#58;

    - <code>SOCK&#95;STREAM</code> для TCP (надёжное соединение).

    - <code>SOCK&#95;DGRAM</code> для UDP (ненадёжное соединение).

    ```cpp
    int type = SOCK_STREAM;
    ```

1. <strong>Протокол</strong>&#58;

    - Обычно задаётся значением <code>0</code>, что позволяет системе выбрать протокол по умолчанию для указанного типа сокета.

    ```cpp
    int protocol = 0;
    ```

#### Пример создания сокета&#58;

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

:::note[Ссылки для изучения]

1. [Гайд начинающему сетевому программисту](https://habr.com/ru/articles/582370/)
   :::
