刚刚学习ACE,对ACE的一些东西还不了解,现在就将ACE手册中的一些例程做了些修改,写了一个主从式的数据接收和发送程序。
这里,数据发送数据端使用的是WinSock函数库完成的,接收端使用的是ACE库完成的。开发环境是VC 7.1
这段例程的功能主要是发送端发送输入的字符串,接收端将接收到的数据打印出来。
首先是接收端的代码:
#include " stdafx.h "
#include < iostream >
using namespace std;
#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 "
#define MAXHOSTNAMELEN 1024
// int _tmain(int argc, _TCHAR* argv[])
int ACE_TMAIN( int argc, _TCHAR * argv[])
{
ACE_INET_Addr port_to_listen( 6000 , ACE_LOCALHOST );
ACE_SOCK_Acceptor acceptor;
if ( - 1 == acceptor.open(port_to_listen, 1 ))
{
ACE_ERROR_RETURN( (LM_ERROR,
ACE_TEXT( " %p " )
ACE_TEXT( " acceptor.open " )), 100 );
}
while ( 1 )
{
ACE_SOCK_Stream peer;
ACE_INET_Addr peer_addr;
ACE_Time_Value timeout( 10 , 0 );
if ( - 1 == acceptor.accept(peer, (ACE_Addr * ) & peer_addr, & timeout) )
{
if ( ACE_OS::last_error() == EINTR )
{
ACE_DEBUG( (LM_DEBUG,
ACE_TEXT( " (%P|%t) Interrupted while " )
ACE_TEXT( " waiting for connection " )) );
}
else if (ACE_OS::last_error() == ETIMEDOUT)
{
ACE_DEBUG( (LM_DEBUG,
ACE_TEXT( " (%P|%t) Timeout while " )
ACE_TEXT( " waitting for connection " )) );
}
}
else
{
ACE_TCHAR peer_name[MAXHOSTNAMELEN];
peer_addr.addr_to_string( peer_name, MAXHOSTNAMELEN );
ACE_DEBUG( (LM_DEBUG,
ACE_TEXT( " (%P|%t) Connection from %s " ),
peer_name));
char buffer[ 4096 ];
ssize_t bytes_received;
while ( - 1 != (bytes_received = peer.recv(buffer, sizeof (buffer))) )
{
buffer[bytes_received] = '
发送端代码:
#include
"
stdafx.h
"
#include < iostream >
#include < string >
using namespace std;
int InitWinSockServer( void );
int _tmain( int argc, _TCHAR * argv[])
{
InitWinSockServer();
sockaddr_in addr;
::memset( & addr, 0x00 , sizeof (addr) );
addr.sin_port = ::htons( 6000 );
addr.sin_addr.S_un.S_addr = ::inet_addr( " 127.0.0.1 " );
addr.sin_family = PF_INET;
SOCKET s = socket( PF_INET, SOCK_STREAM, 0 );
::connect( s, (sockaddr * ) & addr, sizeof (addr) );
for (;;)
{
std:: string user_input;
std::getline (cin, user_input, ' ' );
if ( ! cin || cin.eof ()) break ;
int isend = ::send( s, user_input.c_str(), user_input.length(), 0 );
}
return 0 ;
}
int InitWinSockServer( void )
{
// 启动WinSock服务
WORD VersionRequested = MAKEWORD( 1 , 1 );
WSADATA wsaData;
WSAStartup( VersionRequested, & wsaData );
if ( wsaData.wVersion != VersionRequested )
{
// 启动winsock服务失败
::MessageBox( NULL, " 失败 " , " winsock服务启动失败! " , MB_OK );
return - 1 ;
}
return 0 ;
}
#include < iostream >
#include < string >
using namespace std;
int InitWinSockServer( void );
int _tmain( int argc, _TCHAR * argv[])
{
InitWinSockServer();
sockaddr_in addr;
::memset( & addr, 0x00 , sizeof (addr) );
addr.sin_port = ::htons( 6000 );
addr.sin_addr.S_un.S_addr = ::inet_addr( " 127.0.0.1 " );
addr.sin_family = PF_INET;
SOCKET s = socket( PF_INET, SOCK_STREAM, 0 );
::connect( s, (sockaddr * ) & addr, sizeof (addr) );
for (;;)
{
std:: string user_input;
std::getline (cin, user_input, ' ' );
if ( ! cin || cin.eof ()) break ;
int isend = ::send( s, user_input.c_str(), user_input.length(), 0 );
}
return 0 ;
}
int InitWinSockServer( void )
{
// 启动WinSock服务
WORD VersionRequested = MAKEWORD( 1 , 1 );
WSADATA wsaData;
WSAStartup( VersionRequested, & wsaData );
if ( wsaData.wVersion != VersionRequested )
{
// 启动winsock服务失败
::MessageBox( NULL, " 失败 " , " winsock服务启动失败! " , MB_OK );
return - 1 ;
}
return 0 ;
}