#include "ace/INET_Addr.h"
#include "ace/SOCK_Connector.h"
#include "ace/SOCK_Stream.h"
#include <iostream>
using namespace std;
int ACE_TMAIN (int argc, ACE_TCHAR* argv[])
{
const char *pathname=argc>1 ? argv[1]:"index.html";
const char *servername=argc>2 ? argv[2]:"ace.ece.uci.edu";
ACE_SOCK_Connector connector;
ACE_SOCK_Stream peer;
ACE_INET_Addr peer_addr;
if(peer_addr.set(80,servername)==-1)
return -1;
else
if(connector.connect(peer,peer_addr)==-1)
return -1;
char buf[BUFSIZ];
iovec iov[3];
iov[0].iov_base="GET ";
iov[0].iov_len=4;
iov[1].iov_base=(char*)pathname;
iov[1].iov_len=strlen(pathname);
iov[2].iov_base="http/1.0/r/n/r/n";
iov[2].iov_len=13;
if(peer.sendv(iov,3)==-1)
return -1;
for(ssize_t n;(n=peer.recv(buf,sizeof buf))>0;)
ACE::write_n(ACE_STDOUT,buf,n);
system("pause");
return peer.close()==-1?1:0;
}
简单了解 ACE_SOCK_Connector ACE_SOCK_Stream ACE_INET_Addr 的用 法
ACE_SOCK_Connector
用来主动建立一个新的通信端,提供 的功能有:
1 发起一个到“对等接受者( peer acceptor )”的连接,并在建立后初始化一个 ACE_SOCK_Stream 对象;
2 连接可以通过“阻塞”,“非阻塞”或定时方式发起;
主要的方法:
conncet(stream:ACE_SOCK_Stream&,remote_addr:ACE_Addr&,timeout:ACE_Time_Value*=0)
通过“阻塞”,“非 阻塞”或“定时”模式之一,主动连接某一网络地址上的 ACE_SOCK_Stream
complete(stream:ACE_SOCK_Stream&,remote_addr:ACE_Addr*=0,timeout: ACE_Time_Value*=0)
结束一个“非阻塞” 连接并初始化一个 ACE_SOCK_Stream
注: ACE_SOCK_Connector 默认情况下是“阻塞”通信的,如果要设“非阻塞”的可以把 ACE_Time_Value::zero 传递给它,设置“定时”的可以定义一个 timeout 参数给它,如 ACE_Time_Value timeout(10), 然后把 &timeout 传给 ACE_SOCK_Connector
ACE_INET_Addr :
继承于 ACE_Addr (不进行介绍),用于表示 TCP/IP 和 UDP/IP 的地址信息的,主要方法:
ACE_INET_Addr(port:unsigned short,host:const char*),set(port:unsigned short,host:const char*),
通过主机名, IP 地址和(或)端口号初始化 ACE_INET_Addr
string_to_add(address: const char*):int , 将字符串转换成 ACE_INET_Addr
add_to_string(s:char*,max:size_t,ipfmt:int=1):int ,将 ACE_INET_Addr 转换为字符串
get_port_number () 以“主机字节顺序”返回端口号
get_host_name ( buff:char*,max:size_t ) :int 返回主机名
ACE_SOCK_Stream:
封装了“数据模式” socket 支持的数据传输机制
主要方法:
send(buf:void*,n:size_t,timeout:ACE_Time_Value*=0):int
recv(buf:void*,n:size_t,timeout:ACE_Time_Value*=0):int
两个函数用于发送和接收数据缓冲区数据。读,写的字节 数可能比请求的字节数少,因为它们要受“ os 中的缓冲机制”和“传输协议中的流量控制”影响
send_n(buf:void *,len:size_t,timeout:ACE_Time_Value*=0,bytes_sentsize_t*=0):size_t
recv_n(buf:void *,len:size_t,timeout:ACE_Time_Value*=0,bytes_recvdsize_t*=0):size_t
这两个函数用于发送,接收恰好 n 个字节的缓冲区数据,简化“少量写入”和 “少量读取”时的应用程序处理
sendv_n(v:iovec[],cnt:size_t,timeout:ACE_Time_Value*=0,bytes_sent:size_t*=0)
使用 OS 的“集中写入”系统函数,高效,完整地读 取多个缓冲区数据
recvv_n(v:iovec[],cnt:size_t,timeout:ACE_Time_Value*=0,bytes_recvd:size_t*=0)
使用 OS 的“分散读取”系统函数,高效,完整地接 收多个缓冲区数据
enable(ACE_NONBLOCK)/disable(ACE_NONBLOCK) 方法继承于 ACE_IPC_SAP 类,用于设置 ACE_SOCK_Stream 类的“非阻 塞”和“阻塞”模式