#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类的“非阻塞”和“阻塞”模式