Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗cpSpSoInr 675 of 696 menu
◀ ▶

Введение в сокеты в C++

Две программы через сеть связывает TCP-соединение.

На стороне сервера сокет слушает номер порта на машине; клиент обращается к паре хост и порт, чаще всего к 127.0.0.1 при локальной проверке. После установки связи обе стороны читают и пишут один непрерывный поток байтов через send и recv в буфер с явным размером.

Заголовки sys/socket.h, netinet/in.h, arpa/inet.h и unistd.h дают семейство AF_INET, тип SOCK_STREAM и функцию socket. Адрес IPv4 заполняют в sockaddr_in: порт переводят через htons, строку 127.0.0.1 - через inet_pton. Создадим сокет и подготовим структуру для порта 18080:

#include <arpa/inet.h> #include <cstdlib> #include <netinet/in.h> #include <sys/socket.h> #include <unistd.h> int main() { int fd = socket(AF_INET, SOCK_STREAM, 0); if (fd == -1) { return 1; } sockaddr_in addr{}; addr.sin_family = AF_INET; addr.sin_port = htons(18080); if (inet_pton(AF_INET, "127.0.0.1", &addr.sin_addr) != 1) { close(fd); return 1; } close(fd); return 0; }

Сервер привязывает сокет к адресу функцией bind, переводит его в режим ожидания через listen, а затем принимает клиента вызовом accept. Каждый открытый дескриптор закрывают close, в том числе сокет после accept. Запишем прослушивание на 127.0.0.1 и освободим ресурсы перед выходом из main:

#include <arpa/inet.h> #include <cstdlib> #include <netinet/in.h> #include <sys/socket.h> #include <unistd.h> int main() { int listen_fd = socket(AF_INET, SOCK_STREAM, 0); if (listen_fd == -1) { return 1; } sockaddr_in addr{}; addr.sin_family = AF_INET; addr.sin_port = htons(18080); if (inet_pton(AF_INET, "127.0.0.1", &addr.sin_addr) != 1) { close(listen_fd); return 1; } if (bind(listen_fd, reinterpret_cast<sockaddr*>(&addr), sizeof(addr)) == -1) { close(listen_fd); return 1; } if (listen(listen_fd, 1) == -1) { close(listen_fd); return 1; } close(listen_fd); return 0; }

Полный обмен строкой в одном процессе разберем отдельно; здесь важно помнить про проверку кодов возврата и про закрытие всех дескрипторов, чтобы порт не оставался занятым после завершения программы.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить