我已经编写了这段代码来发送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_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中收到的客户端地址。服务器从客户端到其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 是否更新了执行情况?**