Io_uring клиентский прием смешивает ответыLinux

Ответить
Anonymous
 Io_uring клиентский прием смешивает ответы

Сообщение Anonymous »

Я пытаюсь написать сервер и клиент на C++, используя io_uring. «Протокол» прост: отправьте int32_t и получите массив этого целого числа, но если я увеличу размер пакета со 128 до 4096 байт, я начну получать некоторые пакеты, половина которых состоит из одного запроса, а другая из еще одна просьба. Вот фрагмент журнала:

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

[0] Iterations received: 120000 [139629 it/s]
[0] Incorrect response at index 125629, value 32161280
[0] Received out-of-range response at index 32140800
First 30 and last 30 bytes: 00 6E EA 01 00 6E EA 01 00 6E EA 01 00 6E EA 01 00 6E EA 01 00 6E EA 01  ... 00 BE EA 01 00 BE EA 01 00 BE EA 01 00 BE EA 01 00 BE EA 01 00 BE EA 01
И чуть позже появляется вторая половина:

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

First 30 and last 30 bytes: 00 D3 EA 01 00 D3 EA 01 00 D3 EA 01 00 D3 EA 01 00 D3 EA 01 00 D3 EA 01  ... 00 D4 EA 01 00 D4 EA 01 00 D4 EA 01 00 D4 EA 01 00 D4 EA 01 00 D4 EA 01
[0] Incorrect response at index 125652, value 125652
First 30 and last 30 bytes: 6E EA 01 00 6E EA 01 00 6E EA 01 00 6E EA 01 00 6E EA 01 00 6E EA 01 00  ... D4 EA 01 00 D4 EA 01 00 D4 EA 01 00 D4 EA 01 00 D4 EA 01 00 D4 EA 01 00
[0] Iterations received: 130000 [138256 it/s]
Я понимаю, что TCP должен представлять собой поток данных, но как я могу узнать, какой пакет какой в ​​этих частичных/смешанных приемах?
Код вполне обычный, вот некоторые важные части. Как сервер отправляет ответ:

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

  struct io_uring_sqe* sqe = io_uring_get_sqe(&ring);
auto* req = new RequestData{WRITE_EVENT};

io_uring_prep_send(sqe, client_socket, data, PAGE_SIZE * sizeof(int32_t), 0);
io_uring_sqe_set_data(sqe, req);
Как клиент читает ответ:

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

  auto* recv_buffer = new int32_t[PAGE_SIZE];
struct io_uring_sqe* sqe_recv = io_uring_get_sqe(&ring);
io_uring_prep_recv(sqe_recv, sock, recv_buffer,
PAGE_SIZE * sizeof(int32_t), MSG_WAITALL);
auto* request_data_recv = new RequestData{RECV_EVENT, recv_buffer};
io_uring_sqe_set_data(sqe_recv, request_data_recv);
Здесь вы можете увидеть MSG_WAITALL, это сделало передачу более надежной.
В противном случае, при размере ответа 4096 байт и 1024*1024 сообщениях, Я получаю 1048269 правильных ответов и 307 неправильных ответов по шлейфу.
Полный код можно увидеть здесь — https://github.com/sssemil/fast_net. Соответствующие файлы (зависят только от библиотеки, spdlog в них не используется):

Подробнее здесь: https://stackoverflow.com/questions/784 ... es-replies
Ответить

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

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

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

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

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