Перейти к содержимому
шпаргалка.
Esc
навигацияоткрыть⌘Jпредпросмотр
На этой странице

Сокеты

Все темы 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;
}

Эта страница была полезной?