ACE_SOCK_Connector和ACE_SOCK_Acceptor
来源:互联网 发布:js banner轮播 编辑:程序博客网 时间:2024/05/22 13:20
ACE就是将socket中的tcp部分按照这两种角色划分的。一个ACE_SOCK_Connector和ACE_SOCK_Acceptor。在这两个角色中间,有一个中间人--ACE_SOCK_Stream起通讯的作用。
换一种方式来说,ACE_SOCK_Stream相当于原来的file descriptor,ACE_SOCK_Connector相当于connect函数,ACE_SOCK_Acceptor相当于accept函数。ACE将与之相伴的函数调用全部封装起来。剩下这两个调用。
另外还有一个ACE_INET_Addr,相当于sockaddr_in(还可以作为sockaddr_in6,不过还用不到),提供了许多构造函数用于。
详细内容里是两个最最简单的client、server程序。
// client.cpp
#include <ace/SOCK_Connector.h>
#include <ace/INET_Addr.h>
#include <ace/Log_Msg.h>
#include <iostream>
#include <cstdlib>
using namespace std;
int main(int argc, char** argv)
{
if (argc < 3) {
cout << "usage: client <host> <port>" << endl;
exit(1);
}
ACE_INET_Addr remote_addr(atoi(argv[2]), argv[1]);
// 构造一个sockaddr_in,并memset..
// 然后调用一些我也记不住的函数把字符串地址转为ip地址..
// 当然,htons之类的也是必不可少,全部被搞定了..
ACE_SOCK_Connector connector;
// 缺省构造函数什么都不作,当然也可以直接用构造函数connect
// 用法和成员函数connect相同..
ACE_SOCK_Stream stream;
// 这个构造函数也是什么都不错,太懒了...
char buf[BUFSIZ];
if (connector.connect(stream, remote_addr) == -1)
ACE_ERROR_RETURN((LM_ERROR, "(%P|%t) %p/n", "connection failed"), -1);
// connect就是重头戏了,他先调用ACE_SOCK_Stream的open函数..
// 也就相当于调用::socket..
// 有需要的话再调用一下::bind,然后就::connect了..
for (ssize_t n; (n = stream.recv(buf, sizeof buf)) > 0;)
ACE::write_n(ACE_STDOUT, buf, n);
// 然后就是从stream里的file descriptor读东东了..
// 这些可都是inline函数哦..
}
// server.cpp
#include <iostream>
#include <ace/INET_Addr.h>
#include <ace/SOCK_Acceptor.h>
#include <ace/Log_Msg.h>
using namespace std;
int main(int argc, char** argv)
{
if (argc != 2) {
cout << "usage: server <port>/n";
exit(1);
}
ACE_INET_Addr server_addr(atoi(argv[1]));
ACE_SOCK_Acceptor acceptor(server_addr);
// 不能再让构造函数这么懒了,给他参数叫他去调用open
// 也就是 ::socket和 ::bind...
ACE_SOCK_Stream stream;
ACE_INET_Addr client_addr;
char buf[] = "server sended message/n";
while (1)
{
if (acceptor.accept(stream, &client_addr) == -1)
ACE_ERROR((LM_ERROR, "%p/n", "accept"));
// 开始accept了,会设置stream的handle为新的连接...
else if (stream.send_n(buf, strlen(buf) + 1, 0) == -1)
ACE_ERROR_RETURN((LM_ERROR, "(%P|%t) %p/n", "send"), 0);
if (stream.close() == -1)
ACE_ERROR_RETURN((LM_ERROR, "(%P|%t) %p/n", "close"), 0);
}
return 0;
}
- ACE_SOCK_Connector和ACE_SOCK_Acceptor
- ACE - ACE_INET_Addr, ACE_SOCK_Acceptor, ACE_SOCK_Connector, ACE_SOCK_Stream
- ACE中UDP通信ACE_INET_Addr类ACE_SOCK_Acceptor类ACE_SOCK_Connector类ACE_SOCK_Stream
- ACE基本APISOCKET编程TCPACE_INET_Addr类ACE_SOCK_Acceptor类ACE_SOCK_Connector类ACE_SOCK_Stream
- 关于ACE_INET_Addr和ACE_SOCK_Connector的小技巧
- 使用Reactor来管理ACE_Sock_Acceptor
- ACE学习之ACE_INET_Addr,ACE_SOCK_Acceptor 源代码
- ACE中ACE_SOCK下ACE_SOCK_Acceptor类解析
- 关于ACE静态库不能使用ACE_SOCK_Acceptor::accpet函数的迷思
- . 和 ->
- || 和&&
- .和::
- “?”和“!”
- #和##
- && 和 ||
- 、和
- #和##
- .//和..//
- #include与using namespace
- 使用jquery按比例缩放图片
- dwr2.0反转ajax在IE中不能实时刷新问题
- Java如何遍历Map的所有的元素
- 远程(如通过互联网)连接access数据库的方法 (转)
- ACE_SOCK_Connector和ACE_SOCK_Acceptor
- Flex 非常实用的资料
- Google唤起你心底最深层次、真正不加隐藏的欲望
- 主流浏览器曝0Day漏洞 八成网民面临被“钓鱼”风险
- Edraw Max试用感受
- CheckBox全选处理
- VC进行COM编程要掌握的几点知识
- AUTOCAD下文件名无效问题
- 读了今天的文章后感