//============================================================================
// Name : Serv.cpp
// Author : archy
// Version :
// Copyright : Your copyright notice
// Description : Hello World in C++(www.cppentry.com), Ansi-style
//============================================================================
#include <iostream>
#include
"ace/SOCK_Connector.h"#include
"ace/SOCK_Acceptor.h"#include
"ace/SOCK_Stream.h"#include
"ace/INET_Addr.h"#include
"ace/Addr.h"#include
"pthread.h"#include <map>
using namespace std;
std::map<
int,ACE_SOCK_Stream *> clientMap;
void *process_client(
void* peer)
{
ACE_TCHAR buf[
64] = {
0};
int length =
0;
while((length = static_cast<ACE_SOCK_Stream *>(peer)->recv(buf,
64)) != -
1)
{
buf[length] =
'\0';
for(std::map<
int,ACE_SOCK_Stream *>::iterator iter = clientMap.begin();
iter != clientMap.end();
iter ++)
{
if(iter->second == peer)
{
continue;
}
iter->second->send_n(buf,length);
}
printf(
"recv string %s\n",buf[
4]);
}
static_cast<ACE_SOCK_Stream *>(peer)->close();
return 0;
}
int main()
{
ACE_INET_Addr port_to_listen(
50000,ACE_LOCALHOST);
ACE_SOCK_Acceptor acceptor;
ACE_INET_Addr peer_addr;
if(-
1 == acceptor.open(port_to_listen,
1))
{
printf(
"error accept open\n");
return -
1;
}
ACE_SOCK_Stream *peer;
while(
true)
{
peer =
new ACE_SOCK_Stream();
if(-
1 == acceptor.accept((*peer),&peer_addr))
{
printf(
"error acceptor accept\n");
return -
1;
}
else {
pthread_t pid;
ACE_TCHAR addr[
64] = {
0};
peer_addr.addr_to_string(addr,
64);
printf(
"connection from %s\n",addr);
pthread_create(&pid,
0,process_client,static_cast<
void *>(peer));
clientMap[(
int)peer_addr.get_port_number()] = peer;
}
}
return 0;
}