Клиент сокета в C++
Клиентская сторона открывает соединение после
успешного connect к уже слушающему серверу.
Адрес задают в sockaddr_in с тем же хостом и
портом, что у сервера. Текст передают вызовом
send с длиной буфера в байтах; перевод строки
\n включают в отправляемую строку, если
согласован протокол построчного обмена. После работы
сокет закрывают через close.
Проверим код возврата у socket и
connect, затем отправим строку на
127.0.0.1 и порт 18080:
#include <arpa/inet.h>
#include <cstring>
#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;
}
if (connect(fd, reinterpret_cast<sockaddr*>(&addr), sizeof(addr)) == -1) {
close(fd);
return 1;
}
const char* line = "client line\n";
if (send(fd, line, std::strlen(line), 0) == -1) {
close(fd);
return 1;
}
close(fd);
return 0;
}
Для проверки на той же машине заранее запускают сервер,
который слушает 127.0.0.1:18080 и ждет
accept. Отправим другую строку и выведем на
сервере прочитанный текст в консоль - это делает
программа сервера, а клиент лишь пишет в сокет:
#include <arpa/inet.h>
#include <cstring>
#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;
}
if (connect(fd, reinterpret_cast<sockaddr*>(&addr), sizeof(addr)) == -1) {
close(fd);
return 1;
}
const char* line = "note from client\n";
if (send(fd, line, std::strlen(line), 0) == -1) {
close(fd);
return 1;
}
close(fd);
return 0;
}
В одном запуске клиент отправляет строку
"ping\n" на 127.0.0.1 и порт
18080; сервер печатает ее с префиксом
"got: " в консоли.
Строка "alpha\n" уходит с клиента на
127.0.0.1; на стороне сервера в консоли
должно появиться "alpha" без изменений.