В Linux recv () работает, но recvmsg () не работает - PullRequest
1 голос
/ 12 марта 2019

у меня есть этот код в функции, работающей на Raspberry Pi:

struct sockaddr_in addr_buffer;
struct cmsghdr control_buffer;
struct msghdr msghdr;
struct iovec iov[1];
char msg_buffer[1458];

memset(&msg_buffer, 0, sizeof(msg_buffer));
memset(iov, 0, sizeof(iov));
memset(&msghdr, 0, sizeof(msghdr));

iov[0].iov_base = msg_buffer;
iov[0].iov_len = sizeof(msg_buffer);

msg.msg_iov = iov;
msg.msg_iovlen = 1;

msghdr.msg_name = &addr_buffer;
msghdr.msg_namelen = sizeof(addr_buffer);
msghdr.msg_control = &control_buffer;
msghdr.msg_controllen = sizeof(control_buffer);
msghdr.msg_flags = 0;

//int msgsize = recv(udpsocket_fd, &msg_buffer, 4, 0);

int msgs_received = recvmsg(udpsocket_fd, &msghdr, 0);

Согласно тому, что я прочитал, системный вызов recvmsg () должен вернуться в iovec, указанный msghdrодно сообщение за раз (так как массив iovec имеет длину 1 единицу).Однако это не работает: я правильно получаю заголовки, так как я могу читать с помощью отладчика, IP-адрес которого отправил пакет, но msg_buffer остается пустым.Функция также возвращает 0, что странно, так как это означает, что ошибок не было (что будет возвращать -1), но также означает, что сообщения не были получены (хотя заголовки были обновлены)

ЕслиЯ раскомментирую строку recv (), однако все работает как положено, и сообщение находится в msg_buffer.Но, очевидно, никакой дополнительной информации не получено.Я уже два часа чешу голову и не вижу, что не так с кодом.Большое спасибо за помощь!

1 Ответ

1 голос
/ 12 марта 2019

Из того, что вы показываете, вы просто неправильно инициализируете msghdr. Попробуйте добавить это до recvmsg вызова:

mhdr.msg_iov = iov;
mhdr.msg_iovlen = 1;
...