Я пытаюсь настроить вызов 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 , но версия с одним выстрелом работает, заставляя меня думать, что это не проблема в розетке, а с предоставленными буферами. Есть предложения, где я ошибаюсь?>
Я пытаюсь настроить вызов Multishot recv () на розетке UDP. Тем не менее, в то время как одноразовая версия работает, многократная версия всегда терпит неудачу. У меня есть догадка, как я настраиваю буферное кольцо, но я не вижу проблемы. Все сравнения с аналогичными фрагментами кода делают это правильно (я пытался сводить их настолько далеко): < /p> [code]#include #include #include #include #include #include #include #include
return 0; } [/code] С версией Multishot, возвращаемого значения CQE-> Res вызова чтения всегда является -einval , но версия с одним выстрелом работает, заставляя меня думать, что это не проблема в розетке, а с предоставленными буферами. Есть предложения, где я ошибаюсь?>
В качестве простого проекта для понимания программирования сокетов и многопоточности на C++ я создал 2 сервера и один клиент. Цель состоит в том, чтобы клиент параллельно считывал данные с обоих серверов.
Оба сервера выглядят одинаково, имеют...
В настоящее время я разрабатываю TCP-сервер и использую многопоточность, поэтому для этого я инициализирую сервер с помощью Server.start(), который дает мне тип fd, а затем я инициализирую бесконечный цикл для принятия и запуска нового потока,...
Я использую python и python-can для отправки сообщений\получения и обработки сообщений из CAN-шины, которую я создаю следующим образом:
from can.interface import Bus
bus = Bus(interface= pcan , channel= EXT_CAN , bitrate=500000,...
При повторном прохождении цикла WHILE, перестает слушать RECV() команды от клиента, но скрипт продолжает работать. Не понимаю что делать. Пишу этот серв для общения с другим устройством тоже через сокет. Если убрать другое устройство из кода, все та...