ACE簡單實現網絡聊天(文字)

首先這裏使用了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;
}

因爲初學,所以可能這個程序會有問題,現在先做記錄~深入學習後對代碼進行再次修改~


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章