ACE6测试之ACE_SOCK_Stream2

       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程序员教程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值