Отправка UDP-пакета в C++
Отправка датаграммы кладет буфер байтов в сеть по адресу получателя.
Структуру sockaddr_in заполняют для
127.0.0.1 и порта 18081.
Вызов sendto передает буфер в сеть.
Если на порту никто не слушает, на localhost
отправка все равно завершится без ошибки - прием
в этом уроке не используем.
Создадим сокет SOCK_DGRAM, отправим слово
ping и закроем дескриптор:
#include <arpa/inet.h>
#include <cstring>
#include <netinet/in.h>
#include <sys/socket.h>
#include <unistd.h>
int main() {
int fd = socket(AF_INET, SOCK_DGRAM, 0);
if (fd == -1) {
return 1;
}
sockaddr_in dest{};
dest.sin_family = AF_INET;
dest.sin_port = htons(18081);
if (inet_pton(AF_INET, "127.0.0.1", &dest.sin_addr) != 1) {
close(fd);
return 1;
}
const char msg[] = "ping";
if (sendto(
fd,
msg,
std::strlen(msg),
0,
reinterpret_cast<sockaddr*>(&dest),
sizeof(dest)
) == -1) {
close(fd);
return 1;
}
close(fd);
return 0;
}
Другой текст кладут в тот же каркас - меняют только литерал перед отправкой. Выведем длину второго сообщения в байтах:
#include <arpa/inet.h>
#include <cstring>
#include <iostream>
#include <netinet/in.h>
#include <sys/socket.h>
#include <unistd.h>
int main() {
int fd = socket(AF_INET, SOCK_DGRAM, 0);
if (fd == -1) {
return 1;
}
sockaddr_in dest{};
dest.sin_family = AF_INET;
dest.sin_port = htons(18081);
if (inet_pton(AF_INET, "127.0.0.1", &dest.sin_addr) != 1) {
close(fd);
return 1;
}
const char msg[] = "order 42";
std::size_t len = std::strlen(msg);
if (sendto(
fd,
msg,
len,
0,
reinterpret_cast<sockaddr*>(&dest),
sizeof(dest)
) == -1) {
close(fd);
return 1;
}
std::cout << len << "\n";
close(fd);
return 0;
}
Отправьте на 127.0.0.1 пакет с текстом
"lab send". Приемник пусть выведет
полученную строку в консоль.
Отправьте два пакета подряд с текстами
"first" и "second" на один
порт. Приемник напечатает обе строки по порядку.