使用ACE写的第一个群聊程序

 

呵呵,我使用ACE写的第一个群聊程序,呵呵

 
Thread_Per_Connection.h  为每个客户端建立一个线程
#define  WIN32_LEAN_AND_MEAN
#include "ace/LSOCK_Stream.h"
#include "ace/Thread_Manager.h"
#include "ace/INET_Addr.h"
#include "ace/SOCK_Connector.h"
#include "ace/SOCK_Acceptor.h"
#include "ace/streams.h"
#include <vector>
#include <functional>
#include <algorithm>
#include <iostream>
#include <string>

using namespace std;

class Thread_Per_Connection
{
public:
//参数类
class Thread_Args
{
public:
  Thread_Args(Thread_Per_Connection * thp)
   :this_ (thp){}
   Thread_Per_Connection * this_;
   ACE_SOCK_Stream thread_peer_;
};
//passed as a parameter to <ACE_Thread_Manager::spawn>
static void* run_svc(void * arg);
//接口
int handle_connections();
void handle_data(ACE_SOCK_Stream * client);
int run();
void set_acceptor(ACE_SOCK_Acceptor *acceptor);

ACE_SOCK_Acceptor *acceptor_p;

};
std::vector<Thread_Per_Connection::Thread_Args * >  vector_p;

void Thread_Per_Connection::set_acceptor(ACE_SOCK_Acceptor *acceptor)
{
acceptor_p = acceptor;
}
void Thread_Per_Connection::handle_data(ACE_SOCK_Stream * client)
{
char buf[BUFSIZ];
ACE_Thread_Manager *tm = ACE_Thread_Manager::instance();
ACE_thread_t me = ACE_OS::thr_self();

cout << "Thread_Per_Connection::handle_data"<< endl;

while (!tm->testcancel(me))
{
  //清空BUF
  memset(buf,'\0',sizeof buf);
  //接受消息
  if(client->recv(buf,sizeof buf, 0,0) == -1)
  {
   cout<<"user leaved"<<endl;
   break;
  }

  //1:在本机显示消息
cout<<"客户端: "<<buf<<endl;
  //2:发送给其他客户端。
for (std::vector<Thread_Args * >::iterator iter =  vector_p.begin(); iter != vector_p.end(); ++iter)
        {
   if (&((*iter)->thread_peer_) != client)
   {
    if(((*iter)->thread_peer_.send_n(buf,sizeof buf)) == -1)
      cout << "发送错误!" << endl;
   }
        }
}
}
//服务器对象的运行函数。
int Thread_Per_Connection::run()
{
for (;;)
{
  if (handle_connections () == -1)
   return -1;
  //if (handle_data () == -1)
  // return -1;
}
}

void * Thread_Per_Connection::run_svc(void * arg)
{
Thread_Args * thread_args = ACE_static_cast(Thread_Args *, arg);
::vector_p.push_back(thread_args);
thread_args->this_->handle_data (&thread_args->thread_peer_);

::vector_p.erase(
  remove(::vector_p.begin(), ::vector_p.end(), thread_args),
  ::vector_p.end()
  );
thread_args->thread_peer_.close();
delete thread_args;
return 0;
}
int Thread_Per_Connection::handle_connections()
{
Thread_Args * thread_args = new Thread_Args(this);
if (acceptor_p->accept(thread_args->thread_peer_) == -1)
{
  return -1;
}
else if( ACE_Thread_Manager::instance()->spawn(
   ACE_static_cast(ACE_THR_FUNC, Thread_Per_Connection::run_svc),
  //<run_svc> parameter.
  ACE_static_cast(void *, thread_args),
  THR_DETACHED | THR_SCOPE_SYSTEM
  )//END SPAWN
  == -1
  )
{
  return -1;
}
else
{
  return 0;
}
}
server.cpp
服务器代码
#define  WIN32_LEAN_AND_MEAN
#include "ace/INET_Addr.h"
#include "ace/SOCK_Connector.h"
#include "ace/SOCK_Acceptor.h"
#include "ace/streams.h"
//#include "Thread_Per_Connection.h"
//多线程部分
#include <Windows.h>
#include <stdlib.h>
#include <string>
//#include "server.h"

int main(int argc, char * argv[])
{
Thread_Per_Connection server;
const u_short logger_port = 7000;
ACE_INET_Addr server_addr;
//ACE_INET_Addr client_addr;
//ACE_SOCK_Stream logging_peer;
ACE_SOCK_Acceptor acceptor;
char buf[BUFSIZ];

if(server_addr.set(logger_port/*, (ACE_UINT32)INADDR_ANY*/) == -1)
  cout<<"server set error"<<endl;
acceptor.open(server_addr, 1);
    server.set_acceptor(&acceptor);
server.run();
ACE_Thread_Manager::instance ()->cancel_all ();
ACE_Time_Value timeout(60);
return ACE_Thread_Manager::instance ()->wait ();
}
客户端 client
#include "ace/OS_NS_sys_time.h"
#include "ace/CDR_Stream.h"
#include "ace/Log_Msg.h"
#include "ace/Log_Record.h"
#include "ace/OS_NS_unistd.h"
#include "ace/SOCK_Stream.h"
#include "ace/INET_Addr.h"
#include "ace/SOCK_Connector.h"
#include "ace/streams.h"
//#include "client.h"
//多线程部分
#include <Windows.h>
#include <stdlib.h>
#include <string>
//多线程部分
DWORD WINAPI ThreadFunc(LPVOID);

int main(int argc, char *argv[])
{
//多线程部分
HANDLE hThrd;
DWORD threadId;
u_short port = 7000;
const char *logger_host = "127.0.0.1";
ACE_INET_Addr server_addr;
ACE_SOCK_Stream peer;
ACE_SOCK_Connector connector;
std::string str_buf;
if(server_addr.set(port, logger_host) == -1)
  ACE_ERROR_RETURN((LM_ERROR,
      "lookup %s, %p\n",
      port == 0 ? "ace_logger" : argv[1],
      logger_host),1);
if(connector.connect(peer, server_addr )<0 )
  ACE_ERROR_RETURN((LM_ERROR, "%p\n", "connect()"),1);
//创建另一个线程.
hThrd = CreateThread(
  NULL,
  0,
  ThreadFunc,
  (LPVOID)&peer,
  0,
  &threadId);
if(!hThrd)
{
  cout << "创建多线程出错" << endl;
}

while( getline(cin,str_buf)!= NULL)
{
  if(peer.send(str_buf.c_str() ,str_buf.size()) == -1)
   cout << "发送错误!" << endl;
  str_buf.clear();
}
return 0;
}

DWORD WINAPI ThreadFunc(LPVOID p)
{
char buf[BUFSIZ];
memset(buf,'\0',sizeof buf);
while(1)
{
  //接受
  if(((ACE_SOCK_Stream*)p)->recv(buf,sizeof buf, 0,0) == -1)
  {
   cout<<"user leaved"<<endl;
   break;
  }
  cout<<"服务器: "<<buf<<endl;
  memset(buf,'\0',sizeof buf);
  //多线程部分

}
return 0;

}

 

编译修改后:

#define  WIN32_LEAN_AND_MEAN
#include "ace/LSOCK_Stream.h"
#include "ace/Thread_Manager.h"
#include "ace/INET_Addr.h"
#include "ace/SOCK_Connector.h"
#include "ace/SOCK_Acceptor.h"
#include "ace/streams.h"
#include <vector>
#include <functional>
#include <algorithm>
#include <iostream>
#include <string>

using namespace std;

class Thread_Per_Connection
{
public:

 //参数类
 class Thread_Args
 {
 public:
  Thread_Args(Thread_Per_Connection * thp)
   :this_ (thp){}
  Thread_Per_Connection * this_;
  ACE_SOCK_Stream thread_peer_;
 };
 //passed as a parameter to <ACE_Thread_Manager::spawn>
 static void* run_svc(void * arg);
 //接口
 int handle_connections();
 void handle_data(ACE_SOCK_Stream * client);
 int run();
 void set_acceptor(ACE_SOCK_Acceptor *acceptor);

 ACE_SOCK_Acceptor *acceptor_p;

};
std::vector<Thread_Per_Connection::Thread_Args * >  vector_p;

void Thread_Per_Connection::set_acceptor(ACE_SOCK_Acceptor *acceptor)
{
 acceptor_p = acceptor;
}
void Thread_Per_Connection::handle_data(ACE_SOCK_Stream * client)
{
 char buf[BUFSIZ];
 ACE_Thread_Manager *tm = ACE_Thread_Manager::instance();
 ACE_thread_t me = ACE_OS::thr_self();

 cout << "Thread_Per_Connection::handle_data"<< endl;

 while (!tm->testcancel(me))
 {
  //清空BUF
  memset(buf,'\0',sizeof buf);
  //接受消息
  if(client->recv(buf,sizeof buf, 0,0) == -1)
  {
   cout<<"user leaved"<<endl;
   break;
  }

  //1:在本机显示消息
  cout<<"客户端: "<<buf<<endl;
  //2:发送给其他客户端。
  for (std::vector<Thread_Args * >::iterator iter =  vector_p.begin(); iter != vector_p.end(); ++iter)
  {
   if (&((*iter)->thread_peer_) != client)
   {
    if(((*iter)->thread_peer_.send_n(buf,sizeof buf)) == -1)
     cout << "发送错误!" << endl;
   }
  }
 }
}
//服务器对象的运行函数。
int Thread_Per_Connection::run()
{
 for (;;)
 {
  if (handle_connections () == -1)
   return -1;
  //if (handle_data () == -1)
  // return -1;
 }
}

void * Thread_Per_Connection::run_svc(void * arg)
{
 Thread_Args * thread_args = (Thread_Args *) arg;
 ::vector_p.push_back(thread_args);
 thread_args->this_->handle_data (&thread_args->thread_peer_);

 ::vector_p.erase(
  remove(::vector_p.begin(), ::vector_p.end(), thread_args),
  ::vector_p.end()
  );

 thread_args->thread_peer_.close();
 delete thread_args;
 return 0;
}
int Thread_Per_Connection::handle_connections()
{
 Thread_Args * thread_args = new Thread_Args(this);
 if (acceptor_p->accept(thread_args->thread_peer_) == -1)
 {
  return -1;
 }
 else if( ACE_Thread_Manager::instance()->spawn(
  ACE_THR_FUNC(Thread_Per_Connection::run_svc),
  //<run_svc> parameter.
  (void *)thread_args,
  THR_DETACHED | THR_SCOPE_SYSTEM
  )
  == -1
  )
 {
  return -1;
 }
 else
 {
  return 0;
 }
}

 

server.cpp

#define  WIN32_LEAN_AND_MEAN
#include "ace/INET_Addr.h"
#include "ace/SOCK_Connector.h"
#include "ace/SOCK_Acceptor.h"
#include "ace/streams.h"
#include "ace/Thread_Manager.h"
#include "Thread_Per_Connection.h "
#include "ace/Time_Value.h"

#pragma comment(lib,"ACEd.lib");
//#include "Thread_Per_Connection.h"
//多线程部分
#include <Windows.h>
#include <stdlib.h>
#include <string>
//#include "server.h"

int main(int argc, char * argv[])
{
 Thread_Per_Connection server;
 const u_short logger_port = 7000;
 ACE_INET_Addr server_addr;
 //ACE_INET_Addr client_addr;
 //ACE_SOCK_Stream logging_peer;
 ACE_SOCK_Acceptor acceptor;
 char buf[BUFSIZ];

 if(server_addr.set(logger_port/*, (ACE_UINT32)INADDR_ANY*/) == -1)
  cout<<"server set error"<<endl;
 acceptor.open(server_addr, 1);
 server.set_acceptor(&acceptor);
 server.run();
 ACE_Thread_Manager::instance ()->cancel_all ();
 ACE_Time_Value timeout(60);
 return ACE_Thread_Manager::instance ()->wait ();
}

 

 

client.cpp

#include <ace\OS_NS_sys_time.h>
#include "ace/CDR_Stream.h"
#include "ace/Log_Msg.h"
#include "ace/Log_Record.h"
#include "ace/OS_NS_unistd.h"
#include "ace/SOCK_Stream.h"
#include "ace/INET_Addr.h"
#include "ace/SOCK_Connector.h"
#include "ace/streams.h"
//#include "client.h"
//多线程部分
#include <Windows.h>
#include <stdlib.h>
#include <string>
#pragma comment(lib,"ACEd.lib");
//多线程部分
DWORD WINAPI ThreadFunc(LPVOID);

int main(int argc, char *argv[])
{
 //多线程部分
 HANDLE hThrd;
 DWORD threadId;
 u_short port = 7000;
 const char *logger_host = "127.0.0.1";
 ACE_INET_Addr server_addr;
 ACE_SOCK_Stream peer;
 ACE_SOCK_Connector connector;
 std::string str_buf;
 if(server_addr.set(port, logger_host) == -1)
  ACE_ERROR_RETURN((LM_ERROR,
  "lookup %s, %p\n",
  port == 0 ? "ace_logger" : argv[1],
  logger_host),1);
 if(connector.connect(peer, server_addr )<0 )
  ACE_ERROR_RETURN((LM_ERROR, "%p\n", "connect()"),1);
 //创建另一个线程.
 hThrd = CreateThread(
  NULL,
  0,
  ThreadFunc,
  (LPVOID)&peer,
  0,
  &threadId);
 if(!hThrd)
 {
  cout << "创建多线程出错" << endl;
 }

 while( getline(cin,str_buf)!= NULL)
 {
  if(peer.send(str_buf.c_str() ,str_buf.size()) == -1)
   cout << "发送错误!" << endl;
  str_buf.clear();
 }
 return 0;
}

DWORD WINAPI ThreadFunc(LPVOID p)
{
 char buf[BUFSIZ];
 memset(buf,'\0',sizeof buf);
 while(1)
 {
  //接受
  if(((ACE_SOCK_Stream*)p)->recv(buf,sizeof buf, 0,0) == -1)
  {
   cout<<"user leaved"<<endl;
   break;
  }
  cout<<"服务器: "<<buf<<endl;
  memset(buf,'\0',sizeof buf);
  //多线程部分

 }
 return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值