ACE学习入门

刚刚学习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 ;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值