vstream:ACL_VSTREAM 库的使用方法



1、概述
操作系统在API层为我们提供了进行网络通讯库(库)但使用起来未免复杂而且极易出错虽然这些库最初起源于BSD系统各个操作系统厂商都提供了自身平台接口实现但这些接口在区别OS上又略有差别所以当你想写个跨平台网络通信工作量还是有并且如不知晓各个平台下差异也极易出错
本节向你介绍了怎样使用ACL库中数据流(ACL_VSTREAM)来快速搭建你网络通信;另外ACL_VSTREAM 不仅是跨平台而且既可用于网络通信流又可用于文件流本节仅介绍网络流例子
2、网络通信例子
2.1 个简单服务器

# "lib_acl.h" /* 先包含ACL库头文件 */
# <stdio.h>
# <stdlib.h>

void echo_client(ACL_VSTREAM *client)
{
char buf[1024];
n;

/* 设置客户端流读超时时间为30秒 */
ACL_VSTREAM_SET_RWTIMO(client, 30);

/* 循环读客户端数据直到其关闭或出错或超时 */
while (1) {
/* 等待读客户端发来数据 */
n = acl_vstream_read(client, buf, (buf));
(n ACL_VSTREAM_EOF)
;
/* 将读到数据写回至客户端流 */
(acl_vstream_writen(client, buf, n) ACL_VSTREAM_EOF)
;
}

/* 关闭客户端流 */
acl_vstream_close(client);
}

void run(const char *addr)
{
const char *myname = "run";
ACL_VSTREAM *sstream;
char ebuf[256];

/* 监听个本地地址 */
sstream = acl_vstream_listen(addr, 128);
(sstream NULL) {
prf("%s(%d): listen _disibledevent=> (client NULL) {
prf("%s(%d): accept error(%s)\r\n",
myname, __LINE__,
acl_last_strerror(ebuf, (ebuf)));
;
}
prf("accept _disibledevent=>usage(argv[0]);
(0);
}

init;
run(argv[1]);
(0);
}

由上可以看出创建个服务器是多么简单当然这是个阻塞式线程服务器如果你要想提高并发度可以在线程里处理来自客户端连接

2.2、个简单客户端

# "lib_acl.h"
# <stdio.h>
# <stdlib.h>

void run(const char *addr)
{
const char *myname = "run";
ACL_VSTREAM *client;
char ebuf[256], buf[1024];
n, cnt = 0;

/* 连接远程服务器采用阻塞模式连接连接超时为10秒
* 流读超时时间为20秒缓冲区大小为1024字节
*/
client = acl_vstream_connect(addr, ACL_BLOCKING, 10, 20, 1024);
(client NULL) {
prf("%s(%d): connect addr %s error(%s)\r\n",
myname, __LINE__, addr,
acl_last_strerror(ebuf, (ebuf)));
;
}

prf("%s: connect %s ok\r\n", myname, addr);
while (1) {
/* 向服务器发送行数据 */
n = acl_vstream_fprf(client, ">>hi, I'm coming in...(%d)\r\n", cnt);
(n ACL_VSTREAM_EOF)
;

/* 从服务器读取行数据 */
n = acl_vstream_gets(client, buf, (buf));
(n ACL_VSTREAM_EOF)
;

/* 最多循环5次 */
(cnt >= 5)
;

/* 休息下 */
sleep(1);
}
/* 关闭流 */
acl_vstream_close(client);
}

void init(void)
{
#def ACL_MS_WINDOWS
/* 在WIN32下SOCKET需要化 */
acl__init;
#el d(ACL_UNIX)
/* 在UNIX下需要忽略SIGPIPE信号以免异常退出 */
signal(SIGPIPE, SIG_IGN);
#end
}

void usage(const char *procname)
{
prf("usage: %s server_addr\r\n", procname);
prf("example: %s 127.0.0.1:8081\r\n", procname);
}

( argc, char *argv)
{
(argc != 2) {
usage(argv[0]);
(0);
}

init;
run(argv[1]);
(0);
}

看来创建网络客户端原来也这么简单

3、小结
由以上例子可以看出ACL库屏蔽底层SOCKET细节操作使网络编程变得简单使使用者可以专心于其应用而不是拘泥于SOCKET操作上


当然若要完全编译通过别忘了还需要包含ACL库 2进制版本 lib_acl.a (Unix) 或 lib_acl_vc2003.lib(Windows)

Tags:  p2p终结者使用方法 ghost使用方法 数据库的使用方法 vstream

延伸阅读

最新评论

发表评论