Функция uv_udp_send () возвращает код ошибки -22, что означает UV_EINVAL - PullRequest
0 голосов
/ 13 ноября 2018

Я написал этот кусок кода для отправки UDP Messege.

static void send_message(uv_udp_t* handle, const struct sockaddr* addr, char* message, unsigned int length){
  uv_udp_send_t* send_req = (uv_udp_send_t*)malloc(sizeof(uv_udp_send_t));
  memset(send_req, 0x0, sizeof(uv_udp_send_t));
  uv_buf_t sndbuf = uv_buf_init(message, length);
  int error = uv_udp_send(send_req, handle, (const struct uv_buf_t *)&sndbuf, 1, addr, on_send);
  if(error < 0){
      printf("!! error %s\n", uv_strerror(error));
      printf("error code = %d\n", error);
  }
}

Вот основная функция, которая вызывает вышеуказанную функцию -

int main(int argc, char** argv) {   

    reply_delayed_t reply;
    reply.code = 0xf;
    reply.load = 7;
    MAKE_BUFFER(wake_buffer, reply);

    send_message(&dsocket_2, wakeup_client_addr, wake_buffer, SIZE_OF_WAKE_UP);
    return 0;
}

Нет ошибки компиляции. Но во время выполнения на консоли я обнаружил, что вызов функции вернул код ошибки -22, который говорит о недопустимых аргументах. Может кто-нибудь помочь мне разобраться с этим?

Некоторые подробности об аргументах, передаваемых в send_message (), приведены ниже. я думаю, что я должен упомянуть эти детали.

Переменные uv_udp_t dsocket_2 и const struct sockaddr* wakeup_client_addr определены в другом файле var.c и включены в этот файл ( wake.c ) из файла заголовка ( serve_client.h ).

var.c

#include <uv.h>
#include "serve_client.h"

const struct sockaddr* wakeup_client_addr = NULL;
uv_udp_t dsocket_2;

serve_client.h

#ifndef ServerClient_H
#define ServerClient_H
#include <uv.h>

extern const struct sockaddr* wakeup_client_addr;
extern uv_udp_t dsocket_2;
#endif

Есть два файла с основной функцией ( server.c и wake.c ). Оба файла содержат файл заголовка, упомянутый выше. я создал один исполняемый файл для wake.c и var.c . И есть еще один исполняемый файл, включающий файлы server.c и var.c . В server.c выполняется привязка dsocket_2, и переменная wakeup_client_addr , которая была NULL в начале, обновляется с некоторым адресом, который является адресом клиента, полученным в on_recv функция обратного вызова server.c , когда сервер получает некоторый пакет udp от клиента к его dsocket_2. Исполняемый файл server.c запускается первым и работает отлично. Здесь я предполагаю, что всякий раз, когда сервер получает некоторый пакет в своем dsocket_2, переменная wakeup_client_addr обновляется с полученным клиентским адресом, и, поскольку dsocket_2 также уже привязана, оба могут быть доступны для исполняемого файла. для wake.c при запуске, но я получаю код ошибки -22 из функции uv_udp_send (), в котором указано «неверные аргументы». Я запутался, что получает ли исполняемый файл wake.c доступ к значениям wakeup_client_addr и dsocket_2 , что server.c Обновления о его исполнении? **

...