呵呵,我使用ACE写的第一个群聊程序,呵呵
#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){}
ACE_SOCK_Stream thread_peer_;
};
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;
};
void Thread_Per_Connection::set_acceptor(ACE_SOCK_Acceptor *acceptor)
{
acceptor_p = acceptor;
}
{
char buf[BUFSIZ];
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;
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;
// 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);
::vector_p.erase(
remove(::vector_p.begin(), ::vector_p.end(), thread_args),
::vector_p.end()
);
delete thread_args;
}
{
Thread_Args * thread_args = new Thread_Args(this);
{
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;
}
}
#include "ace/SOCK_Connector.h"
#include "ace/SOCK_Acceptor.h"
#include "ace/streams.h"
#include <Windows.h>
#include <stdlib.h>
//#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;
server.set_acceptor(&acceptor);
server.run();
ACE_Time_Value timeout(60);
return ACE_Thread_Manager::instance ()->wait ();
#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/SOCK_Connector.h"
#include "ace/streams.h"
//#include "client.h"
#include <Windows.h>
#include <stdlib.h>
DWORD WINAPI ThreadFunc(LPVOID);
int main(int argc, char *argv[])
{
//多线程部分
HANDLE hThrd;
DWORD threadId;
const char *logger_host = "127.0.0.1";
ACE_INET_Addr server_addr;
ACE_SOCK_Stream peer;
ACE_SOCK_Connector connector;
ACE_ERROR_RETURN((LM_ERROR,
"lookup %s, %p\n",
port == 0 ? "ace_logger" : argv[1],
logger_host),1);
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();
}
}
DWORD WINAPI ThreadFunc(LPVOID p)
{
char buf[BUFSIZ];
memset(buf,'\0',sizeof buf);
{
//接受
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;
}