首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Libuv UDP基本发送

Libuv UDP基本发送
EN

Stack Overflow用户
提问于 2016-09-11 22:15:54
回答 3查看 1.9K关注 0票数 1

当我尝试发送一些基本的UDP消息时,它看起来并没有发送。我试着运行几个我在网上找到的例子。我使用SocketTest v3.0.0来测试服务器/客户端。当我测试TCP发送时,一切都像预期的那样工作,但我UDP的情况下,它根本不是。

你能提供一些非常基本的UDP发送代码片段吗?例如,接收方将在localhost上,消息将包含"test“,并且将是固定长度?

我还有一个小问题。如果我在本地主机上发送消息,应用程序(服务器)本身是否可以接收它,并认为其他人发送了它(导致循环),因为它没有连接到某个对等体,它只是发送消息并在同一ip端口上侦听?

谢谢:)

EN

回答 3

Stack Overflow用户

发布于 2017-05-11 18:31:19

这里有很多有用的示例:https://nikhilm.github.io/uvbook/networking.html

代码语言:javascript
运行
复制
uv_loop_t *loop;
uv_udp_t send_socket;
uv_udp_t recv_socket;

int main() {
    loop = uv_default_loop();

    uv_udp_init(loop, &recv_socket);
    struct sockaddr_in recv_addr;
    uv_ip4_addr("0.0.0.0", 68, &recv_addr);
    uv_udp_bind(&recv_socket, (const struct sockaddr *)&recv_addr, UV_UDP_REUSEADDR);
    uv_udp_recv_start(&recv_socket, alloc_buffer, on_read);

    uv_udp_init(loop, &send_socket);
    struct sockaddr_in broadcast_addr;
    uv_ip4_addr("0.0.0.0", 0, &broadcast_addr);
    uv_udp_bind(&send_socket, (const struct sockaddr *)&broadcast_addr, 0);
    uv_udp_set_broadcast(&send_socket, 1);

    uv_udp_send_t send_req;
    uv_buf_t discover_msg = make_discover_msg();

    struct sockaddr_in send_addr;
    uv_ip4_addr("255.255.255.255", 67, &send_addr);
    uv_udp_send(&send_req, &send_socket, &discover_msg, 1, (const struct sockaddr *)&send_addr, on_send);

    return uv_run(loop, UV_RUN_DEFAULT);
}
票数 2
EN

Stack Overflow用户

发布于 2021-05-07 10:01:18

以下是发送UDP数据包并从另一端接收响应的基本示例:

代码语言:javascript
运行
复制
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <uv.h>

uv_udp_t udp_socket;

void alloc_buffer(uv_handle_t *handle, size_t suggested_size, uv_buf_t *buf) {
  buf->base = malloc(suggested_size);
  buf->len = suggested_size;
}

void on_read(uv_udp_t *socket, ssize_t nread, const uv_buf_t *buf, const struct sockaddr *addr, unsigned flags){

  if (nread < 0) {
    fprintf(stderr, "read error %s\n", uv_err_name(nread));
    uv_close((uv_handle_t*) socket, NULL);
  } else if (nread > 0) {
    char sender[17] = { 0 };
    uv_ip4_name((const struct sockaddr_in*) addr, sender, 16);
    printf("recv from %s:%.*s\n", sender, (int)buf->len, buf->base);
  }

  if (buf && buf->base) {
    /* releases the buffer allocated on alloc_buffer() */
    free(buf->base);
  }
}

void on_send(uv_udp_send_t *req, int status) {
  if (status) {
    fprintf(stderr, "send error %s\n", uv_strerror(status));
  }
  /* releases the request allocated on send_msg() */
  if (req) free(req);
}

void send_msg(char *msg){
  uv_buf_t buf = uv_buf_init(msg, strlen(msg)+1);

  struct sockaddr_in send_addr;
  uv_ip4_addr("123.45.67.89", 2222, &send_addr);

  uv_udp_send_t *send_req = malloc(sizeof(uv_udp_send_t));
  uv_udp_send(send_req, &udp_socket, &buf, 1, (const struct sockaddr *)&send_addr, on_send);
}

int main() {
  uv_loop_t *loop = uv_default_loop();

  uv_udp_init(loop, &udp_socket);
  struct sockaddr_in recv_addr;
  uv_ip4_addr("0.0.0.0", 2345, &recv_addr);
  uv_udp_bind(&udp_socket, (const struct sockaddr *)&recv_addr, UV_UDP_REUSEADDR);
  uv_udp_recv_start(&udp_socket, alloc_buffer, on_read);

  send_msg("hi there!");
  send_msg("hello world");

  return uv_run(loop, UV_RUN_DEFAULT);
}
票数 1
EN

Stack Overflow用户

发布于 2018-07-15 23:23:07

你可以尝试stream route handler,虽然是新的,但它是可靠的,并且已经在大流量数据事务中进行了测试。

示例

代码语言:javascript
运行
复制
void read_data(srh_request_t *req);
void read_data(srh_request_t *req) {
  char *a = "CAUSE ERROR FREE INVALID";

  if (strncmp( (char*)req->in_buff->start, "ERROR", 5) == 0) {
    free(a);
  }
  // printf("%d,  %.*s\n", i++, (int) (req->in_buff->end - req->in_buff->start), req->in_buff->start);
  srh_write_output_buffer_l(req, req->in_buff->start, (req->in_buff->end - req->in_buff->start));
  // printf("%d,  %.*s\n", i++, (int) (req->out_buff->end - req->out_buff->start), req->out_buff->start);
}

int main(void) {

  srh_instance_t * instance = srh_create_routing_instance(24, NULL, NULL);
  srh_add_udp_fd(instance, 12345, read_data, 1024, NULL);
  srh_add_tcp_fd(instance, 3232, read_data, 64, NULL);

  srh_start(instance, 1);

  return 0;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39436990

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档