您当前的位置: 首页 >  udp

qianbo_insist

暂无认证

  • 0浏览

    0关注

    399博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

libuv udp server和client

qianbo_insist 发布时间:2022-03-03 23:34:39 ,浏览量:0

libuv

libuv是nodejs异步的io库,并非仅仅是网络,还包括文件,我们使用该库的异步通信机制来制作udp的server和client。 在windows平台上要包含一些lib

1 发送方
#include "uv.h"
#ifdef WIN32
#pragma comment(lib,"ws2_32.lib")
#pragma comment(lib,"Psapi.lib")
#pragma comment(lib,"Iphlpapi.lib")
#pragma comment(lib, "Userenv.lib")
#endif


#include 
#include 
#include 
#include 
#include 



static void alloc_cb(uv_handle_t* handle,
	size_t suggested_size,
	uv_buf_t* buf)
{
	static char slab[1500];
	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 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);
}
#ifdef _WIN32
#include 

void sleep(unsigned milliseconds)
{
	Sleep(milliseconds);
}
#else
#include 

void sleep(unsigned milliseconds)
{
	usleep(milliseconds * 1000); // takes microseconds
}
#endif




int main_sender()
{
	static uv_udp_t client;

	static uv_loop_t *loop;
	static struct sockaddr_in addr;
	loop = uv_default_loop();
	int r;
	r = uv_ip4_addr("0.0.0.0", 0, &addr);
	r = uv_udp_init(loop, &client);
	r = uv_udp_bind(&client, (const struct sockaddr*) &addr, 0);


	uv_ip4_addr("127.0.0.1", 8899, &addr);

	char buffer[1450];
	unsigned int i = 0;
	while (1) {
		uv_udp_send_t req;
		uv_buf_t buf;
		sprintf(buffer ,"the data is %d", i++);
		buf = uv_buf_init((char*)buffer, strlen(buffer));

	
		uv_udp_send(&req,
			&client,
			&buf,
			1,
			(const struct sockaddr*) &addr,
			NULL);
		sleep(1000);
	}
	return 0;
}
接收也就是服务端

所有函数都使用的回调方式,和发送端一样。

#include "udpsender.h"
#include "uv.h"
//#include "task.h"
#include 
#include 
#include 


typedef struct storage1
{
	char flag;
	char *pdata; //数据指针
}storage1;

//申请一对空间
typedef struct storage
{
#define x_flag 1450
	//最多40个人的服务
	static char flag[40];
	static char slab[58000];

}storage;

//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[65536];

	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 base);

	uv_udp_recv_stop(handle);

	//req = malloc(sizeof *req);
	//sndbuf = uv_buf_init("PONG", 4);
	//uv_udp_send(req, handle, &sndbuf, 1, addr, sv_send_cb);
}
int udpstart(uv_loop_t * loop)
{
	struct sockaddr_in addr;
	int r;

	//loop = uv_default_loop();
	r = uv_ip4_addr("localhost", 8899, &addr);
	r = uv_udp_init(loop, &server);
	r = uv_udp_bind(&server, (const struct sockaddr*) &addr, 0);
	r = uv_udp_recv_start(&server, alloc_cb, sv_recv_cb);

	//uv_run(loop, UV_RUN_DEFAULT);

	return 0;
}
关注
打赏
1663161521
查看更多评论
立即登录/注册

微信扫码登录

0.0983s