首先這裏使用了ACE的多線程概念,使用了以下兩個類
ACE_SOCK_Connector connector;
ACE_SOCK_Stream peer;
下面上具體代碼:
Server:
// server.cpp
#include "ace/os_include/os_netdb.h"
#include "ace/OS_NS_errno.h"
#include "ace/INET_Addr.h"
#include "ace/SOCK_Stream.h"
#include "ace/SOCK_Acceptor.h"
#include "ace/Log_Msg.h"
#include "ace/Time_Value.h"
#include "ace/Service_Config.h"
#include "ace/Auto_Event.h"
#include "ace/Singleton.h"
#include "ace/Thread_Manager.h"
#include <iostream>
using namespace std;
const int BUFFERSIZE = 1024;
char buffer[BUFFERSIZE];
ACE_Thread_Mutex mutex;
typedef ACE_Singleton <ACE_Auto_Event, ACE_Thread_Mutex> EVENT;
// work time for writer
static int work_time;
// Reader thread.
static void *reader(void *arg)
{
// Shared data via a reference.
ACE_SOCK_Stream& peer = *(ACE_SOCK_Stream *)arg;
ssize_t bytes_received;
while ((bytes_received = peer.recv(buffer, sizeof(buffer))) > 0)
{
mutex.acquire();
buffer[bytes_received] = 0;
//ACE_DEBUG ((LM_DEBUG, ACE_TEXT("receiver data: %s\n"), buffer));
mutex.release();
}
return 0;
}
// Writer thread.
static void *writer(void *arg)
{
//ACE_SOCK_Stream peer;
ACE_SOCK_Stream& peer = *(ACE_SOCK_Stream *)arg;
while(1)
{
//mutex.acquire();
//ACE_DEBUG ((LM_DEBUG, ACE_TEXT("please you input your code:\n")));
cin>>buffer;
peer.send_n (buffer, sizeof(buffer));
ACE_DEBUG ((LM_DEBUG, ACE_TEXT("Server:please you input your code:\n")));
//mutex.release();
}
return 0;
}
int main (int argv, char *[])
{
ACE_INET_Addr port_to_listen (60000);
ACE_SOCK_Acceptor acceptor;
if (acceptor.open (port_to_listen, 1) == -1)
{
ACE_ERROR_RETURN ((LM_ERROR, ACE_TEXT ("%p\n"), ACE_TEXT ("acceptor.open")), -1);
}
ACE_SOCK_Stream peer;
ACE_INET_Addr peer_addr;
//while (1)
{
//ACE_Time_Value timeout (10, 0);
if (acceptor.accept (peer, &peer_addr) == -1)
{
ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("accept error!\n")));
}
else
{
ACE_TCHAR peer_name[MAXHOSTNAMELEN];
peer_addr.addr_to_string (peer_name, MAXHOSTNAMELEN);
ACE_DEBUG ((LM_DEBUG, ACE_TEXT("Connection from %s\n"), peer_name));
ACE_Thread_Manager& tm = *ACE_Thread_Manager::instance();
peer.send_n("hello Client\nplease input your code:",12);
/* if (tm.spawn((ACE_THR_FUNC)reader, (void *)&peer) == -1)
ACE_ERROR_RETURN((LM_ERROR, "thread create for reader failed"), -1);
*/
// Create writer thread.
if (tm.spawn((ACE_THR_FUNC)writer, (void *)&peer) == -1)
ACE_ERROR_RETURN((LM_ERROR, "thread create for writer failed"), -1);
ssize_t bytes_received;
while ((bytes_received = peer.recv(buffer, sizeof(buffer))) > 0)
{
//mutex.acquire();
buffer[bytes_received] = 0;
ACE_DEBUG ((LM_DEBUG, ACE_TEXT("Client data: %s\nServer:please input your code:\n"), buffer));
// mutex.release();
}
// ACE_Thread_Manager::instance()->wait();
}
}
peer.close ();
ACE_DEBUG ((LM_DEBUG, ACE_TEXT("close the socket.\n")));
ACE_NOTREACHED (return 0);
}
Client:
// client.cpp
#include "ace/INET_Addr.h"
#include "ace/SOCK_Stream.h"
#include "ace/SOCK_Connector.h"
#include "ace/Log_Msg.h"
#include "ace/OS_NS_unistd.h"
#include "ace/Service_Config.h"
#include "ace/Auto_Event.h"
#include "ace/Singleton.h"
#include "ace/Thread_Manager.h"
#include <iostream>
using namespace std;
const int BUFFERSIZE = 1024;
char buffer[BUFFERSIZE];
ACE_Thread_Mutex mutex;
typedef ACE_Singleton <ACE_Auto_Event, ACE_Thread_Mutex> EVENT;
// work time for writer
static int work_time;
// Reader thread.
static void *reader(void *arg)
{
// Shared data via a reference.
ACE_SOCK_Stream& peer = *(ACE_SOCK_Stream *)arg;
ssize_t bytes_received;
while ((bytes_received = peer.recv(buffer, sizeof(buffer))) > 0)
{
mutex.acquire();
buffer[bytes_received] = 0;
ACE_DEBUG ((LM_DEBUG, ACE_TEXT("receiver data: %s\n"), buffer));
mutex.release();
}
return 0;
}
// Writer thread.
static void *writer(void *arg)
{
//ACE_SOCK_Stream peer;
ACE_SOCK_Stream& peer = *(ACE_SOCK_Stream *)arg;
while(1)
{
//mutex.acquire();
//ACE_DEBUG ((LM_DEBUG, ACE_TEXT("please you input your code:\n")));
cin>>buffer;
peer.send_n (buffer, sizeof(buffer));
ACE_DEBUG ((LM_DEBUG, ACE_TEXT("Client:please you input your code:\n")));
//mutex.release();
}
return 0;
}
int main (int argv, char *[])
{
short port = 60000;
const char *ip = "127.0.0.1";
int ret = 0;
char buffer_1[BUFFERSIZE]={};
ACE_INET_Addr srvr (port, ip);
ACE_SOCK_Connector connector;
ACE_SOCK_Stream peer;
ACE_Time_Value time(0,0);
ret= connector.connect (peer, srvr,&time);
//ret= connector.connect (peer, srvr);
if (ret == -1)
{
ACE_ERROR_RETURN ((LM_ERROR,
ACE_TEXT ("%p\n"), ACE_TEXT ("connect")), 1);
}
peer.send_n ("hello Server\nplease input your code:", 12);
// threads manager
ACE_Thread_Manager& tm = *ACE_Thread_Manager::instance();
// Create reader thread.
/*if (tm.spawn((ACE_THR_FUNC)reader, (void *)&peer) == -1)
ACE_ERROR_RETURN((LM_ERROR, "thread create for reader failed"), -1); */
// Create writer thread.
if (tm.spawn((ACE_THR_FUNC)writer, (void *)&peer) == -1)
ACE_ERROR_RETURN((LM_ERROR, "thread create for writer failed"), -1);
ssize_t bytes_received;
while ((bytes_received = peer.recv(buffer, sizeof(buffer))) > 0)
{
//mutex.acquire();
buffer[bytes_received] = 0;
ACE_DEBUG ((LM_DEBUG, ACE_TEXT("Server data: %s\nClient:please input your code:\n"), buffer));
//mutex.release();
}
//ACE_Thread_Manager::instance()->wait();
peer.close ();
ACE_DEBUG ((LM_DEBUG, ACE_TEXT("close socket\n")));
return 0;
}
因爲初學,所以可能這個程序會有問題,現在先做記錄~深入學習後對代碼進行再次修改~