Сокеты
Что такое сокет?
Сокет — это программный интерфейс, обеспечивающий обмен данными между компьютерами по сети. Сокеты используются для установления соединений, передачи и приёма данных по сети.
Основные виды сокетов:
-
TCP-сокеты:-
Обеспечивают надёжное, ориентированное на соединение общение.
-
TCP доставляет принятые байты приложению в порядке отправки и повторяет потерянные сегменты. При неустранимом сбое соединение может завершиться ошибкой; безусловной гарантии доставки или обработки удалённым приложением нет.
-
Используются для приложений, где важна надёжность (например, веб-серверы).
-
-
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;
}
Какие операции можно делать с сокетом?
С сокетами можно выполнять следующие основные операции:
-
Создание сокета:
- Создание нового сокета с помощью
socket().
int sock = socket(AF_INET, SOCK_STREAM, 0); - Создание нового сокета с помощью
-
Привязка сокета:
- Привязка сокета к конкретному адресу и порту с помощью
bind().
bind(sock, (struct sockaddr*)&address, sizeof(address)); - Привязка сокета к конкретному адресу и порту с помощью
-
Прослушивание (только для серверов):
- Перевод сокета в режим ожидания входящих соединений с помощью
listen().
listen(sock, 3); - Перевод сокета в режим ожидания входящих соединений с помощью
-
Принятие соединения (только для серверов):
- Принятие входящего соединения с помощью
accept().
int new_socket = accept(sock, (struct sockaddr*)&address, (socklen_t*)&addrlen); - Принятие входящего соединения с помощью
-
Установка соединения (только для клиентов):
- Установка соединения с удалённым сокетом с помощью
connect().
connect(sock, (struct sockaddr*)&serverAddress, sizeof(serverAddress)); - Установка соединения с удалённым сокетом с помощью
-
Отправка данных:
- Отправка данных через сокет с помощью
send()(для TCP) илиsendto()(для UDP).
send(sock, message, strlen(message), 0); - Отправка данных через сокет с помощью
-
Приём данных:
- Приём данных через сокет с помощью
recv()(для TCP) илиrecvfrom()(для UDP).
recv(sock, buffer, sizeof(buffer), 0); - Приём данных через сокет с помощью
-
Закрытие сокета:
- Закрытие сокета с помощью
close().
close(sock); - Закрытие сокета с помощью
Какая информация нужна, чтобы создать сокет?
Для создания сокета необходимо указать следующую информацию:
-
Адресное семейство:
- Обычно используется
AF_INETдляIPv4илиAF_INET6дляIPv6.
int domain = AF_INET; - Обычно используется
-
Тип сокета:
-
SOCK_STREAMдля TCP (надёжное соединение). -
SOCK_DGRAMдля UDP (ненадёжное соединение).
int type = SOCK_STREAM; -
-
Протокол:
- Обычно задаётся значением
0, что позволяет системе выбрать протокол по умолчанию для указанного типа сокета.
int protocol = 0; - Обычно задаётся значением
Пример создания сокета:
int sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock < 0) {
std::cerr << "Socket creation error" << std::endl;
}