基于libuv库的UDP收/发广播消息代码实现
uv_send(发送端):
- #include "uv.h"
- #include "task.h"
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- static uv_udp_t client;
- static uv_loop_t *loop;
- static void alloc_cb(uv_handle_t* handle,
- size_t suggested_size,
- uv_buf_t* buf)
- {
- static char slab[];
- buf->base = slab;
- buf->len = sizeof(slab);
- }
- static void close_cb(uv_handle_t* handle)
- {
- uv_is_closing(handle);
- }
- static void cl_recv_cb(uv_udp_t* handle,
- ssize_t nread,
- const uv_buf_t* buf,
- const struct sockaddr* addr,
- unsigned flags)
- {
- if (nread < )
- {
- }
- if (nread == )
- {
- return;
- }
- printf("I receive the message from server:%s\n", buf->base);
- uv_close((uv_handle_t*) handle, close_cb);
- }
- static void cl_send_cb(uv_udp_send_t* req, int status)
- {
- uv_udp_recv_start(req->handle, alloc_cb, cl_recv_cb);
- }
- int main(void)
- {
- struct sockaddr_in addr;
- uv_udp_send_t req;
- uv_buf_t buf;
- int r;
- loop = uv_default_loop();
- r = uv_ip4_addr("0.0.0.0", , &addr);
- r = uv_udp_init(loop, &client);
- r = uv_udp_bind(&client, (const struct sockaddr*) &addr, );
- r = uv_udp_set_broadcast(&client, );
- uv_ip4_addr("255.255.255.255", , &addr);
- buf = uv_buf_init("PING", );
- printf("I am sending message to server:%s.\n", buf.base);
- uv_udp_send(&req,
- &client,
- &buf,
- ,
- (const struct sockaddr*) &addr,
- cl_send_cb);
- uv_run(loop, UV_RUN_DEFAULT);
- return ;
- }
uv_recv(接收端):
- #include "uv.h"
- #include "task.h"
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- static uv_loop_t *loop;
- static uv_udp_t server;
- static void alloc_cb(uv_handle_t* handle,
- size_t suggested_size,
- uv_buf_t* buf)
- {
- static char slab[];
- buf->base = slab;
- buf->len = sizeof(slab);
- }
- static void close_cb(uv_handle_t* handle)
- {
- uv_is_closing(handle);
- }
- static void sv_send_cb(uv_udp_send_t* req, int status)
- {
- uv_close((uv_handle_t*) req->handle, close_cb);
- free(req);
- }
- static void sv_recv_cb(uv_udp_t* handle,
- ssize_t nread,
- const uv_buf_t* rcvbuf,
- const struct sockaddr* addr,
- unsigned flags)
- {
- uv_udp_send_t* req;
- uv_buf_t sndbuf;
- if (nread < )
- {
- }
- if (nread == )
- {
- return;
- }
- printf("I receive the message from client:%s.\n", rcvbuf->base);
- uv_udp_recv_stop(handle);
- req = malloc(sizeof *req);
- sndbuf = uv_buf_init("PONG", );
- uv_udp_send(req, handle, &sndbuf, , addr, sv_send_cb);
- }
- int main(void)
- {
- struct sockaddr_in addr;
- uv_udp_send_t req;
- uv_buf_t buf;
- int r;
- loop = uv_default_loop();
- r = uv_ip4_addr("0.0.0.0", , &addr);
- r = uv_udp_init(loop, &server);
- r = uv_udp_bind(&server, (const struct sockaddr*) &addr, );
- r = uv_udp_recv_start(&server, alloc_cb, sv_recv_cb);
- uv_run(loop, UV_RUN_DEFAULT);
- return ;
- }
基于libuv库的UDP收/发广播消息代码实现的更多相关文章
- Linux下UDP收/发广播消息简单实现
发送广播消息 #include<stdio.h> #include<stdlib.h> #include<string.h> #include<sys/typ ...
- UDP收/发广播包原理及步骤
原文链接地址:http://www.2cto.com/net/201311/254834.html UDP收/发广播包原理及步骤 如果网络中两个主机上的应用程序要相互通信,其一要知道彼此的IP,其二要 ...
- UDP 收/发 广播包
网络通信基础 如果网络中两个主机上的应用程序要相互通信,其一要知道彼此的IP,其二要知道程序可监听的端口.因为同一主机上的程序使用网络是通过端口号来区分的. UDP Socket的使用过程: 1. 初 ...
- 一个基于TCP/IP的小项目,实现广播消息的功能。(超详细版)
1.结合现状 功能分析 该功能基于上个项目的改进,主要是通过对服务器端代码的修改,以及对客户端作少许修改,实现开启多客户端时,一个客户端发送消息,达到对所有客户端广播的效果.可参考网吧里的点歌系统,比 ...
- android Broadcast广播消息代码实现
我用的是Fragment , 发送写在一个类中,接收写在另外一个类的内部类中.代码动态实现注册. 代码: myReceiver = new zcd.netanything.MyCar.myReceiv ...
- 一次处理CentOS服务器被攻击往外发广播包
情况是这样:我们在某地托管的一台linux服务器,突然接到机房电话说是我们机器将整个IDC网络搞瘫了.外部机器没法访问IDC. 挂掉电话后:我就开始考虑,托管机器的机房是有硬防的,我本身一台机器怎么 ...
- TinyWeb v1.0 正式完成第一个Release版本(功能基于 libuv 跨平台库)
使用方法很简单,很容易融入现有项目,使现有项目拥有Web网站功能和WebSocket,以及Socket直连! 并且包含了一个跨平台(windows/linux)工具集合; 嗯,也挺棒的^,^ 在项目中 ...
- boost库之udp广播实例
//UdpLinkServer.h //udp服务 #pragma once #include <boost/asio/ip/tcp.hpp> #include <boost/asi ...
- UDP 单播、广播和多播
阅读目录(Content) 一.UDP广播 二.UDP多播 1.多播(组播)的概念 2.广域网的多播 三.UDP广播与单播 广播与单播的比较 使用UDP协议进行信息的传输之前不需要建议连接.换句话说就 ...
随机推荐
- C#通过OLEDB导出大数据到Excel
C#导出数据到Excel,基本有两种方法,一种方法是通过Microsoft.Office.Interop.Excel.Application,一行一列的写入Excel中:另一种方法是通过OLEDB,利 ...
- 模板 树链剖分BFS版本
//点和线段树都从1开始 //边使用vector vector<int> G[maxn]; ],num[maxn],iii[maxn],b[maxn],a[maxn],top[maxn], ...
- 关于android的Activity的四种启动模式
最近做项目遇到一个问题,当触摸屏幕的时候通过intent启动activity,发现会启动多次,而后查阅资料,发现,原来是activity的模式设置问题. Activity的启动模式可以通过Androi ...
- 【翻译】Ext JS最新技巧——2014-5-12
原文:mkt_tok=3RkMMJWWfF9wsRoluazJZKXonjHpfsX77OQlXK%2B%2FlMI%2F0ER3fOvrPUfGjI4AT8NjI%2BSLDwEYGJlv6SgFS ...
- 谈使用Eclipse与DDMS调试Android程序的方法
在Eclipse开发工具中调试程序的方法很多,但是使用Eclipse调试Android程序时需要注意一些细节上的问题.许多刚接触 Android的开发者,在调试Android程序时总是不能迅速地找到程 ...
- Libgdx Box2D真实---这缓释微丸(三:规则经常使用body和精灵联合)
介绍规则body怎样和图片结合.上一篇文章我介绍了box2D的基本知识,假设你用心的话.你会搜索网上相关简单demo吧.那些我就不写了.那么假设我用图片表示我的那个body.而不是简单线条.那该怎么办 ...
- MVC - 学习总目录
MVC - 基础 MVC - HtmlHelper类 MVC - 路由 MVC - 身份验证 MVC - 模型验证 MVC - Ajax MVC - 布局
- WinServer 之 发布WebService后调用出现" The test form is only available for requests from the local machine. "
当您尝试从远程计算机访问 Web 服务时,不会显示“调用”按钮.并且,您会收到以下错误信息: The test form is only available for requests from the ...
- [转]javascript指定事件处理程序包括三种方式:
javascript指定事件处理程序包括三种方式: (1):DOM0级事件处理程序 如: 代码如下: var btn=document.getElementById("mybtn" ...
- iOS之自定义UITabBar替换系统默认的(添加“+”号按钮)
自定义UITabBar替换系统默认的,目的是为了在UITabBar中间位置添加一个“+号按钮”,下面我们来聊聊具体的实现. 1.自定义WBTabBar,让其继承自UITabBar,代码如下: // / ...