基于libuv库的UDP收/发广播消息代码实现

uv_send(发送端):

 1 #include "uv.h"
 2 #include "task.h"
 3
 4 #include <stdio.h>
 5 #include <stdlib.h>
 6 #include <string.h>
 7
 8 static uv_udp_t client;
 9
10 static uv_loop_t *loop;
11
12 static void alloc_cb(uv_handle_t* handle,
13     size_t suggested_size,
14     uv_buf_t* buf)
15 {
16     static char slab[65536];
17     buf->base = slab;
18     buf->len = sizeof(slab);
19 }
20
21 static void close_cb(uv_handle_t* handle)
22 {
23     uv_is_closing(handle);
24 }
25
26 static void cl_recv_cb(uv_udp_t* handle,
27     ssize_t nread,
28     const uv_buf_t* buf,
29     const struct sockaddr* addr,
30     unsigned flags)
31 {
32     if (nread < 0)
33     {
34
35     }
36
37     if (nread == 0)
38     {
39         return;
40     }
41
42     printf("I receive the message from server:%s\n", buf->base);
43
44     uv_close((uv_handle_t*) handle, close_cb);
45 }
46
47
48 static void cl_send_cb(uv_udp_send_t* req, int status)
49 {
50     uv_udp_recv_start(req->handle, alloc_cb, cl_recv_cb);
51 }
52
53 int main(void)
54 {
55     struct sockaddr_in addr;
56     uv_udp_send_t req;
57     uv_buf_t buf;
58     int r;
59
60     loop = uv_default_loop();
61
62     r = uv_ip4_addr("0.0.0.0", 0, &addr);
63     r = uv_udp_init(loop, &client);
64     r = uv_udp_bind(&client, (const struct sockaddr*) &addr, 0);
65     r = uv_udp_set_broadcast(&client, 1);
66     uv_ip4_addr("255.255.255.255", 8899, &addr);
67     buf = uv_buf_init("PING", 4);
68     printf("I am sending message to server:%s.\n", buf.base);
69     uv_udp_send(&req,
70         &client,
71         &buf,
72         1,
73         (const struct sockaddr*) &addr,
74         cl_send_cb);
75
76     uv_run(loop, UV_RUN_DEFAULT);
77
78     return 0;
79 }

uv_recv(接收端):

 1 #include "uv.h"
 2 #include "task.h"
 3
 4 #include <stdio.h>
 5 #include <stdlib.h>
 6 #include <string.h>
 7
 8 static uv_loop_t *loop;
 9 static uv_udp_t server;
10
11 static void alloc_cb(uv_handle_t* handle,
12     size_t suggested_size,
13     uv_buf_t* buf)
14 {
15     static char slab[65536];
16
17     buf->base = slab;
18     buf->len = sizeof(slab);
19 }
20
21 static void close_cb(uv_handle_t* handle)
22 {
23     uv_is_closing(handle);
24 }
25
26 static void sv_send_cb(uv_udp_send_t* req, int status)
27 {
28     uv_close((uv_handle_t*) req->handle, close_cb);
29     free(req);
30 }
31
32 static void sv_recv_cb(uv_udp_t* handle,
33     ssize_t nread,
34     const uv_buf_t* rcvbuf,
35     const struct sockaddr* addr,
36     unsigned flags)
37 {
38     uv_udp_send_t* req;
39     uv_buf_t sndbuf;
40
41     if (nread < 0)
42     {
43
44     }
45
46     if (nread == 0)
47     {
48         return;
49     }
50
51     printf("I receive the message from client:%s.\n", rcvbuf->base);
52
53     uv_udp_recv_stop(handle);
54
55     req = malloc(sizeof *req);
56
57     sndbuf = uv_buf_init("PONG", 4);
58     uv_udp_send(req, handle, &sndbuf, 1, addr, sv_send_cb);
59 }
60
61 int main(void)
62 {
63     struct sockaddr_in addr;
64     uv_udp_send_t req;
65     uv_buf_t buf;
66     int r;
67
68     loop = uv_default_loop();
69     r = uv_ip4_addr("0.0.0.0", 8899, &addr);
70     r = uv_udp_init(loop, &server);
71     r = uv_udp_bind(&server, (const struct sockaddr*) &addr, 0);
72     r = uv_udp_recv_start(&server, alloc_cb, sv_recv_cb);
73
74     uv_run(loop, UV_RUN_DEFAULT);
75
76     return 0;
77 }
时间: 2024-10-10 17:00:42

基于libuv库的UDP收/发广播消息代码实现的相关文章

UDP 收/发 广播包

网络通信基础 如果网络中两个主机上的应用程序要相互通信,其一要知道彼此的IP,其二要知道程序可监听的端口.因为同一主机上的程序使用网络是通过端口号来区分的. UDP Socket的使用过程: 1. 初始化网络库 2. 创建SOCK_DGRAM类型的Socket. 3. 绑定套接字. 4. 发送.接收数据. 5. 销毁套接字. 6. 释放网络库. 广播数据包的原理: 专门用于同时向网络中所有工作站进行发送的一个地址叫做广播地址.在使用TCP/IP 协议的网络中,主机标识段host ID 为全1 的

一个基于TCP/IP的小项目,实现广播消息的功能。(超详细版)

1.结合现状 功能分析 该功能基于上个项目的改进,主要是通过对服务器端代码的修改,以及对客户端作少许修改,实现开启多客户端时,一个客户端发送消息,达到对所有客户端广播的效果.可参考网吧里的点歌系统,比如某某用户在网吧点了一首歌,其他用户电脑的左下角都会弹出一个某某用户点了一首七里香,或者游戏里面的频道聊天,每个人发完消息后,聊天室里的人都知道你发的消息了,就像下图一样,这也正是做这个功能的初衷吧. 2.图说代码 代码细说: 服务器里面定义了两个字段,一个用于服务器与客户端的连接,另一个目的在于做

android Broadcast广播消息代码实现

我用的是Fragment , 发送写在一个类中,接收写在另外一个类的内部类中.代码动态实现注册. 代码: myReceiver = new zcd.netanything.MyCar.myReceiver(); IntentFilter filter = new IntentFilter(); //向过滤器中添加action filter.addAction("zcd.netanything"); //注册广播 getActivity().registerReceiver(myRece

一次处理CentOS服务器被攻击往外发广播包

情况是这样:我们在某地托管的一台linux服务器,突然接到机房电话说是我们机器将整个IDC网络搞瘫了.外部机器没法访问IDC. 挂掉电话后:我就开始考虑,托管机器的机房是有硬防的,我本身一台机器怎么会造成这么大影响.于是又联系机房硬防厂家询问状况,最后得到的答复是我托管的 服务器往外发广播消息,将机房硬防会话都沾满了,其它设备就没有可用会话了. 处理:   情况了解后,我第一反应就是先远程ssh 上去看看.结果connect之后令我大失所望,竟然密码也被修改了,无法访问.那时的感觉就是想撞墙.呵

TinyWeb v1.0 正式完成第一个Release版本(功能基于 libuv 跨平台库)

使用方法很简单,很容易融入现有项目,使现有项目拥有Web网站功能和WebSocket,以及Socket直连! 并且包含了一个跨平台(windows/linux)工具集合; 嗯,也挺棒的^,^ 在项目中嵌入TinyWeb服务,响应特定path,或输出内部运行状态,或触发某个动作,如此一来,用户(或开发者自己)通过Web浏览器即可轻松完成与项目程序的有效沟通,至少免除了进程通讯之类的东西吧,通过特殊的path(比如http://localhost:3060/hillhim)给自己的程序留一个小小的后

关于基于GDAL库QT软件平台下C++语言开发使用说明

背景前提 地理空间数据抽象库(GDAL)是一个用于读取和编写栅格和矢量地理空间数据格式的计算机软件库,由开源地理空间基金会在许可的X / MIT风格免费软件许可下发布. 作为一个库,它为调用应用程序提供了一个抽象数据模型,用于所有支持的格式. 它还可以构建有各种有用的命令行接口实用程序,用于数据转换和处理. PROJ.4库支持投影和转换.(摘自维基百科) 相关的OGR库(OGR Simple Features Library [2])是GDAL源代码树的一部分,它为简单的特征矢量图形数据提供了类

基于 libpcap库的sniffer程序

基于 libpcap库的sniffer程序 Libpcap库是WireSharek和Tcpdump抓包程序的基础,利用libcap我们自己也可以实现自己的抓包程序,在网络上实时抓包分析,或者利用处理的结果用作业务用途. 1.   Libpcap抓取的数据包的结构 在实现我们的基于libcap的程序之前,我们先来了解一下libpcap(wiresharek和tcpdump也是这样)抓取的网络包的结构.下面以tcp/ip协议包为例: 上面的数据包一共有6部分:文件头,数据报报头,以太网帧头,IP头,

记录一个UDP收包丢包的问题

这几天写GB28181平台接入层代码,对收到的PS包进行解包时,总是出现误码,最终导致rtsp点播服务中画面花屏. 分析了码流抓包数据之后,发现网络上没有丢包,遂认为PS流解包代码有bug,于是埋头分析了2个小时的解包函数后,没有发现问题.将抓包RTP负载中的PS包数据导出之后,专门利用PS解包代码写了一个小程序,对导出的数据进行处理,又没有问题——后来事实证明解包代码的确没有问题,而且这部分的代码是在其他项目中用过的.自己有些迷糊了,一时想不明白问题出在哪里. 起身转了几圈冷静后分析一下,认为

基于libuv的TCP设计(二)

一.本人设想的TCP服务器有如下特性: 1.启动服务,一直监听端口. 2.有新连接(客户端)就通知用户.并把连接接收到的数据回调给用户. 3.客户端连接上后用户可在任意时间发送数据给它. 4.客户端断开时关闭或用户可手动关掉. 以上操作都可以不同线程在完成. 二.使用libuv遇到的问题 由于对libuv不熟悉+其文档,调用其函数时吃了不少苦头. 1.libuv的特性 libuv是基于event驱动的,当调用uv_run后就会一直启动event循环,阻塞其线程(event loop thread