-
libuv
之基础
TCP
客户端连接步骤:
①
.连接方法
Uv_loop_t *loop =
uv_default_loop(); uv_tcp_t *client =
malloc…;uv_connect_t* connect_req =
malloc…;
uv_tcp_init(loop, client)
uv_tcp_connect(connect_req,
client, addr,
connect_cb); uv_run(loop); getchar(); /
/
服务
端不需要这个,
现在还不明白为
什么
②.回调函数
static
void
connect_cb(uv_connect_t*req, int
status){
int r;
uv_buf_t buf = uv_buf_init(
这
必须是动态分
配内存,在
uv_write
函数内部会对这个指针赋值。
uv_write_t
*reqw = (uv_write_t*)malloc(sizeof *reqw);
在
write_cb
中,释放分配的内存。
r =
uv_write(reqw,
(uv_stream_t*)(req->handle),&buf,
1, write_cb);} static void
write_cb(uv_write_t*req, int
status){}static void
read_cb(uv_stream_t*tcp, ssize_t nread,
uv_buf_t buf){}uv_connect_tis a
subclass of uv_req_t
服务端连接步骤①.连接方法
loop =
uv_default_loop();
structsockaddr_in addr =
uv_ip4_addr(
int r;
server =
(uv_handle_t*)&tcpServer;
r =
uv_tcp_init(loop, &tcpServer);
if
(r){
std::cout <<
error
return;
}
r =
uv_tcp_bind(&tcpServer, addr);
if
(r){
std::cout <<
std::endl;
return;
}
r
=uv_listen((uv_stream_t*)&tcpServer, 10,
on_connection);
if
(r){
std::cout <<
<<
std::endl;
return;
}
uv_run(loop); ②.回调函数
static
voidon_connection(uv_stream_t* server,
int
status){
uv_stream_t*
stream;
int
r;
用这
种方式来初始化一个新连接
stream =
(uv_stream_t*)malloc(sizeof(uv_tcp_t));
ASSERT(stream != NULL);
r =
uv_tcp_init(loop,(uv_tcp_t*)stream);
stream->data = server;
r =
uv_accept(server,
stream);}
*uv_stream_t is a subclass of uv_handle_t * *
uv_stream is an abstract class. * *
uv_stream_t is the
parent class of
uv_tcp_t,uv_pipe_t, uv_tty_t, and * soon
uv_file_t.
在客户端的连接中
Uv_tcp_connect(connect_req…);connec
t_
req
是一个
uv_connect_t*
参数,相应的
connect_cb
的第一个参数为
uv_connect_t*,(uv_connect_t
是
uv_req_t
的子类
)
服务端的
连接中
uv_listen((uv_str
eam_t*)&tcpServer,10,
on_connection
);
相应的
on_connect
的第
一个参数为
uv_stream_t*
看来
< br>
的思想和
ACE
非常像,把请求
对象和连接对象分别封装成不同概念的东西。
–
open
创建套接字然后使用
uv_tcp_open
,再
uv_tcp_connect
时,
函数内部不会再
创建套接字,仅此而已。
_read_stopUv_rea
d_stop((uv_stream_t*)&tcp_ha
ndle);U
v_close((uv_handle_t*)tcp_handle);
UDP
客户端:
uv_udp_send_t req;
r =
uv_udp_init(uv_default_loop(),&clie
nt);
ASSERT(r == 0);
buf = uv_buf_init(
r =
uv_udp_send(&req, &client,&buf, 1,
addr,
cl_send_cb);
voidcl_send_cb(uv_udp_send_t*
req, intstatus)
{}UDP
服务端:
r =
uv_udp_init(uv_default_l
oop(),&server);
ASSERT(r == 0);
r =
uv_udp_bind(&server,
addr, 0);
ASSERT(r == 0);
r =
uv_udp_recv_start(&server,alloc_cb,
sv_recv_cb);
ASSERT(r == 0);
static void sv_recv_cb(uv_udp_t*