锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
姝ゆ枃鎻忚堪浜嗙粍鎴怉CE妗嗘灦鐨凴eactor妯″紡鐨勮璁″拰鎵ц銆俁eactor璐熻矗澶勭悊鐢變竴涓垨澶氫釜client騫跺彂鐨勪紶閫掔粰涓涓簲鐢ㄧ▼搴忕殑鏈嶅姟璇鋒眰銆傚簲鐢ㄧ▼搴忕殑姣忎釜鏈嶅姟鐢變竴涓垎紱葷殑event handler錛堜簨浠跺彞鏌勶級鎵ц錛宔vent handler鍖呮嫭涓涓垨澶氫釜榪涚▼鐨勬湇鍔″櫒鐗規畩璇鋒眰鐨勬柟娉曘?/p>
姝ゆ枃鎻忚堪鐨凴eactor妯″紡鐨勬墽琛岋紝event handler鍒嗗彂鏄敱ACE_Reactor瀹炵幇鐨勩侫CE_Reactor緇撳悎I/O浜嬩歡鐨勫垎紱誨櫒錛屼互鍙婂叾浠栫被鍨嬬殑鏃墮棿錛屾瘮濡倀imers鍜宻ignals銆侫CE_Reactor鐨勬牳蹇冨疄鐜版槸鍩轟簬鍚屾浜嬩歡鍒嗙錛屾瘮濡俿elect鎴栬匴aitForMultipleObjects銆傚綋鍒嗙鍣ㄦ寚紺烘寚瀹氱殑浜嬩歡鍙戠敓浜嗭紝ACE_Reactor浼氳嚜鍔ㄥ垎鍙戦鍏堟敞鍐岀殑浜嬩歡鍙ユ焺鐨勬柟娉曘傛敞鍐岀殑event handler鏂規硶浼氬畬鎴愬簲鐢ㄧ▼搴忓搴旇姹備簨浠剁殑鏈嶅姟銆?/p>
鏈枃緇勭粐濡備笅錛氱浜岀珷鎻忚堪ACE_Reactor妗嗘灦涓昏鐗規э紱絎笁绔犲ぇ鑷翠粙緇岮CE_Reactor瀹炵幇鐨凮O錛堥潰鍚戝璞★級璁捐錛涚鍥涚珷涓句簡鏈嶅姟鍣ㄧ瀹炵幇鐨勪緥瀛愶紝鐢ㄤ互璇佹槑ACE_Reactor鎬庢牱綆鍖栧茍鍙戠殑錛屽熀浜庝簨浠剁殑緗戠粶搴旂敤紼嬪簭鐨勫彂灞曪紱絎簲绔犳弿榪板綋浣跨敤ACE_Reactor寮鍙戝熀浜庝簨浠剁殑搴旂敤紼嬪簭鐨勮璁¤鍒欙紱絎叚绔犳槸緇撴潫璇?/p>
2 ACE_Reactor鐨勭壒鎬?/p>
ACE_Reactor鎻愪緵OO鐨勪簨浠跺垎紱繪満鍒跺拰娑堟伅鍒嗗彂妗嗘灦錛屽畠綆鍖栧熀浜庝簨浠剁殑搴旂敤紼嬪簭鐨勫紑鍙戙備互涓嬬壒鎬ф槸錛?/p>
OO鐨勪簨浠跺垎紱誨拰娑堟伅鍒嗗彂鎺ュ彛錛?/p>
浣跨敤ACE_Reactor鐨勫簲鐢ㄧ▼搴忎笉鐩存帴璋冪敤搴曞眰OS錛堟搷浣滅郴緇燂級鐨勪簨浠跺垎紱籄PI鍑芥暟銆傛瘮濡俿elect鎴朩aitForMultipleObjects銆備粬浠戶鎵緼CE Event Handler鍩虹被騫跺垱寤轟簡鍏蜂綋鐨別vent handlers銆傝繖涓被鐢ㄧ壒瀹氱殑铏氭嫙鍑芥暟澶勭悊涓嶅悓綾誨瀷鐨勪簨浠訛紝姣斿I/O浜嬩歡錛宼imer浜嬩歡錛宻ignals錛堜俊鍙烽噺鏈哄埗錛夛紝鍜屽悓姝ヤ簨浠躲?/p>
搴旂敤紼嬪簭鐢≧eactor妗嗘灦鍒涘緩鍏蜂綋鐨別vent handler錛屽茍娉ㄥ唽浠栦滑銆傜壒鎬?鏄劇ず浜咥CE Reactor.鐨勫叧閿粍浠躲傝繖涓壒鎬ф弿榪版墽琛屾棩瀛愭湇鍔$殑浜嬩歡鍙ユ焺錛岃繖涓湪絎洓绔犺榪般?br>
server绔唬鐮侊細
// 鐜VC6.0+ACE5.4.2
// proj:ACE stream server
// date:07-7-24
// robin
//
#include "stdafx.h"
#include "ace/Log_Msg.h"
#include "ace/Time_Value.h"
#include "ace/OS.h"
#include "ace/SOCK_Acceptor.h"
#include "ace/SOCK_Stream.h"
#define SIZE_DATA 18
#define SIZE_BUF 1024
#define NO_ITERATIONS 5
class Server
{
public:
Server (int port) : server_addr_(port),peer_acceptor_(server_addr_)
{
data_buf_ = new char[SIZE_BUF];
}
//Handle the connection once it has been established. Here the
//connection is handled by reading SIZE_DATA amount of data from the
//remote and then closing the connection stream down.
int handle_connection()
{
// Read data from client
for(int i=0;i<NO_ITERATIONS;i++)
{
int byte_count=0;
if( (byte_count = new_stream_.recv_n(data_buf_, SIZE_DATA, 0) ) == -1 )
ACE_ERROR ((LM_ERROR, "%p\n", "Error in recv"));
else
{
data_buf_[byte_count]=0;
ACE_DEBUG((LM_DEBUG,"Server received %s \n",data_buf_));
}
}
// Close new endpoint
if (new_stream_.close () == -1)
ACE_ERROR ((LM_ERROR, "%p\n", "close"));
return 0;
}
//Use the acceptor component peer_acceptor_ to accept the connection
//into the underlying stream new_stream_. After the connection has been
//established call the handle_connection() method.
int accept_connections ()
{
if (peer_acceptor_.get_local_addr (server_addr_) == -1)
ACE_ERROR_RETURN ((LM_ERROR,"%p\n","Error in get_local_addr"),1);
ACE_DEBUG ((LM_DEBUG,"Starting server at port %d\n",
server_addr_.get_port_number ()));
// Performs the iterative server activities.
while(1)
{
ACE_Time_Value timeout (ACE_DEFAULT_TIMEOUT);
if (peer_acceptor_.accept(new_stream_, &client_addr_, &timeout)== -1)
{
ACE_ERROR ((LM_ERROR, "%p\n", "accept"));
continue;
}
else
{
ACE_DEBUG((LM_DEBUG,
"Connection established with remote %s:%d\n",
client_addr_.get_host_name(),client_addr_.get_port_number()));
//Handle the connection
handle_connection();
}
}
}
private:
char *data_buf_;
ACE_INET_Addr server_addr_;
ACE_INET_Addr client_addr_;
ACE_SOCK_Acceptor peer_acceptor_;
ACE_SOCK_Stream new_stream_;
};
int main (int argc, char *argv[])
{
if(argc<2)
{
ACE_ERROR((LM_ERROR,"Usage %s <port_num>", argv[0]));
ACE_OS::exit(1);
}
// char *ip;
// ip = new char[strlen("192.168.1.160")];
// Server server(ACE_OS::atoi(ip)); //argv[1])
Server server(ACE_OS::atoi(argv[1]));
server.accept_connections();
return 0;
}
client绔細
// proj:ACE stream client
// client
// date:7-24
// robin
#include "stdafx.h"
//******additional*******//
#include "ace/Log_Msg.h" //ACE_ERROR ACE_DEBUG
#include "ace/Time_Value.h" // ACE_Time_Value
#include "ace/OS.h" // ACE_OS::atoi exit
//******additional*******//
#include "ace/SOCK_Connector.h"
#include "ace/INET_Addr.h"
#define SIZE_BUF 128
#define NO_ITERATIONS 5
class Client
{
public:
Client(char *hostname, int port):remote_addr_(port,hostname)
{
data_buf_="Hello from Client";
}
//Uses a connector component `connector_’ to connect to a
//remote machine and pass the connection into a stream
//component client_stream_
int connect_to_server()
{
// Initiate blocking connection with 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) connected to %s\n",
remote_addr_.get_host_name ()));
return 0;
}
//Uses a stream component to send data to the remote host.
int send_to_server()
{
// Send data 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 down the connection
close();
}
//Close down the connection properly.
int close()
{
if (client_stream_.close () == -1)
ACE_ERROR_RETURN ((LM_ERROR,"(%P|%t) %p\n","close"),-1);
else
return 0;
}
private:
ACE_SOCK_Stream client_stream_;
ACE_INET_Addr remote_addr_;
ACE_SOCK_Connector connector_;
char *data_buf_;
};
int main(int argc, char* 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 0;
}
榪愯緇撴灉錛?br>cmd閲屽埌exe鐩綍涓嬶紝鍏堝惎鍔ㄦ湇鍔$server.exe 192.168.1.160
濡傚浘1錛?br>
姝e湪杞絳夊緟銆?br>
鍐嶅埌client鏈嶅姟绔紝鍚屾牱鐨勬柟娉?br>榪愯鍛戒護琛屽弬鏁版牸寮?client.exe 192.168.1.160 192
瑙f瀽錛欰CE_DEBUG((LM_DEBUG,"Usage %s <hostname> <port_number>\n", argv[0]));
鍛戒護琛屽弬鏁頒負 <hostname><port> = <192.168.1.160><192>
绔彛鏄敱鍥?鐨勭浜岃鏄劇ず錛屼笉鏄嚜宸辮瀹氱殑銆?br>濡傚浘2錛?br>