uv_udp_send()函数返回错误代码-22,表示UV_EINVAL

时间:2018-11-13 05:24:03

标签: c networking udp libuv

我已经编写了这段代码来发送udp消息。

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_2const 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中收到的客户端地址。服务器从客户端到其dsocket_2接收一些udp数据包时, server.c 回调函数。 server.c 的可执行文件首先运行,并且运行良好。在这里,我假设只要服务器在其dsocket_2上接收到一些数据包,变量 wakeup_client_addr 就会使用接收到的客户端地址进行更新,并且由于 dsocket_2 也已经绑定,因此两者都可以通过 wake.c 的可执行文件在运行时,但是我从uv_udp_send()函数中收到错误代码-22,指出“无效参数”。 我感到困惑的是, wake.c的可执行文件是否可以访问服务器的 wakeup_client_addr dsocket_2 的值。 c 是否更新了执行情况?**

0 个答案:

没有答案