Введение в сокеты в 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;
}
Полный обмен строкой в одном процессе разберем отдельно; здесь важно помнить про проверку кодов возврата и про закрытие всех дескрипторов, чтобы порт не оставался занятым после завершения программы.