ACE_SOCK_Connector和ACE_SOCK_Acceptor

来源:互联网 发布:js banner轮播 编辑:程序博客网 时间:2024/05/22 13:20
对于面向连接的网络应用程序,一般都存在两种角色。server和client,或者说connector和acceptor。

ACE就是将socket中的tcp部分按照这两种角色划分的。一个ACE_SOCK_ConnectorACE_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;
}

原创粉丝点击