Connect_to_server()方法使用类型为 ACE_SOCK_Connector 的连接器(connector_)来主动地建立连接。连接的设置通过调用连接器 connector_上的 connect()方法来完成:传入的参数为我们想要连接的机器的地址 remote_addr_,以及用于在其中建立连接的空 ACE_SOCK_Stream client_stream_。
远地机器在例子的运行时参数中指定。一旦 connect()方法成功返回,通过使用 ACE_SOCK_Stream 封装类中的 send()和recv()方法族,流就可以用于在新建立的链路上发送和接收数据了。
在此例中, 一旦连接建立好, send_to_server()方法就会被调用, 以将一个字符串发送 NO_ITERATIONS次到服务器。如前面所提到的,这是通过使用流包装类的 send()方法来完成的。
Client.h
#pragma once
#include "ace/SOCK_Connector.h"
#include "ace/INET_Addr.h"
#include "ace/Log_Msg.h" ///ACE_DEBUG...
#define SIZE_BUF 128
#define NO_ITERATIONS 5
class Client
{
public:
Client(char *hostname,int port);
int connect_to_server();
int send_to_server();
int close();
~Client(void);
private:
ACE_SOCK_Stream client_stream_;
ACE_INET_Addr remote_addr_;
ACE_SOCK_Connector connector_;
char *data_buf_;
};
Client.cpp
#include "Client.h"
#include "ace/OS_NS_string.h" ///strlen
Client::Client(char *hostname,int port):remote_addr_(port,hostname)
{
data_buf_="hello from client";
}
Client::~Client(void)
{
}
int Client::connect_to_server()
{
ACE_DEBUG((LM_DEBUG,"(%P|%t) starting connect to %s:%d\n",
remote_addr_.get_host_name(),remote_addr_.get_port_number()));
if(connector_.connect(client_stream_,remote_addr_)== -1)
{
ACE_ERROR_RETURN((LM_ERROR,"%P|%t %p\n","connection failed"),-1);
}
else
{
ACE_DEBUG((LM_DEBUG,"(%P|%t) connect to %s\n",
remote_addr_.get_host_name()));
}
return 0;
}
int Client::send_to_server()
{
for(int i=0; i<NO_ITERATIONS; i++)
{
if(client_stream_.send_n(data_buf_,
ACE_OS::strlen(data_buf_)+1,0)== -1)
{
ACE_ERROR_RETURN((LM_ERROR,"(%P|%t) %p\n","send_n"),0);
break;
}
}
close();
}
int Client::close()
{
if(client_stream_.close()== -1)
ACE_ERROR_RETURN((LM_ERROR,"(%P|%t %p\n)","close"),-1);
else
return 0;
}
main.cpp
#include <QtCore/QCoreApplication>
#include "ace/OS_NS_stdlib.h" ///ACE_OS::exit,atoi
#include "Client.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
if(argc<3)
{
ACE_DEBUG((LM_DEBUG,"Usage %s <hostname> <port_number>\n",argv[0]));
ACE_OS::exit(1);
}
Client client(argv[1],ACE_OS::atoi(argv[2]));
client.connect_to_server();
client.send_to_server();
return a.exec();
}
Tianzimk摘自ACE程序员教程