//============================================================================
// Name : Serv.cpp
// Author : archy
// Version :
// Copyright : Your copyright notice
// Description : Hello World in C++, 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;
}
//============================================================================
// Name : Cli.cpp
// Author : archy
// Version :
// Copyright : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================
#include <iostream>
#include "ace/INET_Addr.h"
#include "ace/SOCK_Connector.h"
#include "ace/SOCK_Acceptor.h"
#include "ace/SOCK_Stream.h"
#include "pthread.h"
using namespace std;
void* list_recv(void* peer)
{
char buf[64] = {0};
int length = 0;
while((length = static_cast<ACE_SOCK_Stream *>(peer)->recv(buf,64)) != -1)
{
buf[length] = '\0';
printf("rev string %s\n",buf);
}
return 0;
}
int main()
{
ACE_INET_Addr ser_addr(50000,ACE_LOCALHOST);
ACE_SOCK_Connector connector;
ACE_SOCK_Stream *peer = new(std::nothrow) ACE_SOCK_Stream();
if(peer == NULL)
{
return -1;
}
if(connector.connect(*peer,ser_addr) == -1)
{
cout <<" connect error! "<< endl;
return -1;
}
char buf[64] = "start";
pthread_t pid;
pthread_create(&pid,0,list_recv,static_cast<void *>(peer));
while(gets(buf))
{
if(strlen(buf) == 0)
{
continue;
}
(*peer).send_n(buf,strlen(buf));
//peer.recv(buf,64);
}
peer->close();
printf("rev string %s\n",buf);
return 0;
}