Как я могу объединить recv_multishot с буферным кольцом в io_uring?Linux

Ответить Пред. темаСлед. тема
Anonymous
 Как я могу объединить recv_multishot с буферным кольцом в io_uring?

Сообщение Anonymous »

Я пытаюсь настроить вызов Multishot recv () на розетке UDP. Тем не менее, в то время как одноразовая версия работает, многократная версия всегда терпит неудачу. У меня есть догадка, как я настраиваю буферное кольцо, но я не вижу проблемы. Все сравнения с аналогичными фрагментами кода делают это правильно (я пытался сводить их настолько далеко): < /p>

Код: Выделить всё

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

#define BUF_BGID 0
#define N_BUFS 128
#define PAGESIZE 4096
#define BUFSIZE 8192
#define PORT 49000

int main(int argc, char *argv[])
{
struct sockaddr_in addr;
int sock_fd;
char* bufs; // All bufs go here
int i;

struct io_uring ring;
struct io_uring_buf_ring* br = NULL;
struct io_uring_sqe *sqe;
struct io_uring_cqe* cqe;

/* Set up socket */
addr.sin_family = AF_INET;
addr.sin_port = htons(PORT);
inet_aton("0.0.0.0", &addr.sin_addr);

/* Create UDP socket */
sock_fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
bind(sock_fd, (struct sockaddr*)&addr, sizeof(addr));

/* Create uring */
if (io_uring_queue_init(N_BUFS, &ring, 0) < 0) {
fprintf(stderr, "Could not init ring.\n");
return 1;
}

/* Create buffers and buffer ring */
if (posix_memalign((void**)&bufs, PAGESIZE, BUFSIZE * N_BUFS)) {
fprintf(stderr, "Could not allocate memory.\n");
return 1;
}
memset((void*)bufs, 0, BUFSIZE * N_BUFS);
int err = 0;
br = io_uring_setup_buf_ring(&ring, N_BUFS, BUF_BGID, 0, &err);
if (!br) {
fprintf(stderr, "Could not create buffer ring.\n");
}
io_uring_buf_ring_init(br);
for (i = 0; i < N_BUFS; i++) {
io_uring_buf_ring_add(br, bufs + i * BUFSIZE, BUFSIZE, i,
io_uring_buf_ring_mask(N_BUFS), i);

}
io_uring_buf_ring_advance(br, N_BUFS);

/* Set up recv SQE */
sqe = io_uring_get_sqe(&ring);
io_uring_sqe_set_flags(sqe, IOSQE_BUFFER_SELECT);
sqe->buf_group = BUF_BGID;
io_uring_prep_recv_multishot(sqe, sock_fd, NULL, 0, 0); /* This doesn't work! */
/*io_uring_prep_recv(sqe, sock_fd, bufs, BUFSIZE, 0);*/ /* This works! */
if (io_uring_submit(&ring) < 0) {
fprintf(stderr, "Failed to submit SQE.\n");
return 1;
}

if (io_uring_wait_cqe(&ring, &cqe) < 0) {
fprintf(stderr, "Could not get CQE.\n");
return 1;
}

if (cqe->res < 0) {
fprintf(stderr, "Bad CQE result: %s\n", strerror(-cqe->res));
return 1;
}

fprintf(stderr, "Buffer index: %d\n", cqe->flags >> IORING_CQE_BUFFER_SHIFT);

/* Now do handling and cleanup. */

return 0;
}
С версией Multishot, возвращаемого значения CQE-> Res вызова чтения всегда является -einval , но версия с одним выстрелом работает, заставляя меня думать, что это не проблема в розетке, а с предоставленными буферами. Есть предложения, где я ошибаюсь?>

Подробнее здесь: https://stackoverflow.com/questions/796 ... n-io-uring
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Socket.recv() никогда не возвращает малиновый пико в микропитоне _thread
    Гость » » в форуме Python
    0 Ответы
    23 Просмотры
    Последнее сообщение Гость
  • ПРОБЛЕМА: Recv() - обработка данных с нескольких серверов. (C++11, сокеты, Windows, g++)
    Гость » » в форуме C++
    0 Ответы
    25 Просмотры
    Последнее сообщение Гость
  • Recv не работает в потоке — Windows C++
    Anonymous » » в форуме C++
    0 Ответы
    23 Просмотры
    Последнее сообщение Anonymous
  • Python-can bus.recv пропускает некоторые сообщения
    Anonymous » » в форуме Python
    0 Ответы
    43 Просмотры
    Последнее сообщение Anonymous
  • RECV не слушает. PYTHON [closed]
    Anonymous » » в форуме Python
    0 Ответы
    21 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Linux»