﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-Free space-文章分类-ACE</title><link>http://www.cppblog.com/zoadex/category/1816.html</link><description>OPEN SOURCE.</description><language>zh-cn</language><lastBuildDate>Thu, 22 May 2008 10:35:34 GMT</lastBuildDate><pubDate>Thu, 22 May 2008 10:35:34 GMT</pubDate><ttl>60</ttl><item><title>a ACE TCP Server&amp;Client sample</title><link>http://www.cppblog.com/zoadex/articles/7412.html</link><dc:creator>Free space</dc:creator><author>Free space</author><pubDate>Fri, 19 May 2006 08:18:00 GMT</pubDate><guid>http://www.cppblog.com/zoadex/articles/7412.html</guid><wfw:comment>http://www.cppblog.com/zoadex/comments/7412.html</wfw:comment><comments>http://www.cppblog.com/zoadex/articles/7412.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zoadex/comments/commentRss/7412.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zoadex/services/trackbacks/7412.html</trackback:ping><description><![CDATA[/***************************************************************************<br />server.cpp:    <br />    Copyright (c) 2006, All rights reserved.<br /><br />Purpose:<br />    a ACE TCP Server sample.<br /><br />Author:<br />    Zhao Dexiang<br /><br />Creating Time:<br />    2006-05-19<br />***************************************************************************/<br /><br />#include "ace/SOCK_Acceptor.h"<br />#include "ace/SOCK_Stream.h"<br />#include "ace/OS_NS_stdio.h"<br />#include "ace/Log_Msg.h"<br />#include "ace/Time_Value.h"<br /><br />#define SIZE_BUF 256<br />#define TIMEOUT_SEC 20<br /><br />class Server<br />{<br />public:<br />    Server (int port): server_addr_(port),peer_acceptor_(server_addr_)<br />    {<br />        data_buf_= new char[SIZE_BUF];<br />    }<br /><br />    int handle_connection();<br />    int accept_connections ();<br /><br />private:<br />    char *data_buf_;<br /><br />    ACE_INET_Addr server_addr_;<br />    ACE_INET_Addr client_addr_;<br />    ACE_SOCK_Acceptor peer_acceptor_;<br />    ACE_SOCK_Stream new_stream_;<br />};<br /><br />int<br />Server::handle_connection()<br />{<br />    int byte_count=0;<br /><br />    byte_count=new_stream_.recv_n (data_buf_, SIZE_BUF);<br />    if(byte_count == -1)<br />    {<br />        ACE_ERROR ((LM_ERROR, "%p \n", "Error in recv"));<br />    }<br />    else<br />    {<br />        data_buf_[byte_count] = 0;<br />        ACE_DEBUG((LM_DEBUG,"Server received: %s \n", data_buf_));<br />    }<br /><br />    int n_bytes = 0;<br />    if( ( n_bytes=new_stream_.send_n(data_buf_, byte_count))==-1)<br />    {<br />        ACE_ERROR ((LM_ERROR, "%p \n", "Error in send"));<br />    }<br /><br />    if (new_stream_.close () == -1)<br />    {<br />        ACE_ERROR ((LM_ERROR, "%p \n", "close"));<br />    }<br /><br />    return 0;<br />}<br /><br />int<br />Server::accept_connections ()<br />{<br />    if (peer_acceptor_.get_local_addr (server_addr_) == -1)<br />        ACE_ERROR_RETURN ((LM_ERROR,"%p \n","Error in get_local_addr"),1);<br /><br />    while(1)<br />    {<br />        ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("\nListening server at port: %d \n"), <br />                            server_addr_.get_port_number ()));<br /><br />        ACE_Time_Value timeout (TIMEOUT_SEC);<br />      int accept_t = peer_acceptor_.accept (new_stream_, &amp;client_addr_, &amp;timeout);<br />        if (accept_t == -1)<br />        {<br />            if (ACE_OS::last_error() == EINTR)<br />                ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("Interrupted. \n")));<br />            else<br />                if (ACE_OS::last_error() == ETIMEDOUT)<br />                    ACE_ERROR ((LM_ERROR, "\n %p", "Timeout while accepting"));<br /><br />            continue;<br />        }<br />        else<br />        {<br />            ACE_DEBUG ((LM_DEBUG,<br />                                "Connection established with remote %s: %d \n",<br />                                client_addr_.get_host_name(), client_addr_.get_port_number()));<br /><br />            handle_connection();<br />            ACE_DEBUG ((LM_INFO, "Connection closed at host %s: %d \n", <br />                                client_addr_.get_host_name(), client_addr_.get_port_number()));<br />        }<br />    }<br />}<br /><br />int main (int argc, char *argv[])<br />{<br />    static const u_short port=1009;<br /><br />    Server server(port);<br />    server.accept_connections();<br /><br />    return 0;<br />}<br /><br /><br />/***************************************************************************<br />client.cpp:    <br />
    Copyright (c) 2006, All rights reserved.<br /><br />
Purpose:<br />
    a ACE TCP Client sample.<br /><br />
Author:<br />
    Zhao Dexiang<br /><br />
Creating Time:<br />
    2006-05-19<br />
***************************************************************************/<br />
#include &lt;iostream&gt;<br />#include "ace/SOCK_Connector.h"<br />#include "ace/INET_Addr.h"<br />#include "ace/Log_Msg.h"<br />#include "ace/OS_NS_stdio.h"<br />#include "ace/OS_NS_string.h"<br />#include "ace/OS_NS_unistd.h" <br /><br />#define SIZE_BUF 256<br /><br />class Client<br />{<br />public:<br />    Client(char *hostname, int port):remote_addr_(port,hostname)<br />    {<br />        data_buf_= new char[SIZE_BUF];<br />    }<br /><br />    int connect_to_server();<br />    int send_to_server();<br />    int close();<br /><br />private:<br />    ACE_SOCK_Stream client_stream_;<br />    ACE_INET_Addr remote_addr_;<br />    ACE_SOCK_Connector connector_;<br /><br />    char *data_buf_;<br />};<br /><br />int<br />Client::connect_to_server()<br />{<br />    ACE_DEBUG ((LM_DEBUG, "(%P|%t) Starting connect to %s: %d \n",<br />                        remote_addr_.get_host_name(), remote_addr_.get_port_number()));<br /><br />    if (connector_.connect (client_stream_, remote_addr_) == -1)<br />    {<br />        ACE_ERROR_RETURN ((LM_ERROR,"(%P|%t) %p \n","connection failed"),-1);<br />    }<br />    else<br />    {<br />        ACE_DEBUG ((LM_DEBUG,"(%P|%t) connected to %s \n",<br />        remote_addr_.get_host_name ()));<br />    }<br /><br />    return 0;<br />}<br /><br />int<br />Client::send_to_server()<br />{<br />    std::cout &lt;&lt; ": "; <br />    std::cin &gt;&gt; data_buf_;<br /><br />    int n = 0;<br />    n = client_stream_.send_n (data_buf_, SIZE_BUF);<br />    if (n == -1) {<br />        ACE_ERROR_RETURN ((LM_ERROR,"(%P|%t) %p \n", "send_n"),0);<br />    }<br /><br />  // recv<br />    char recv_buff[SIZE_BUF] = { 0 };<br />    n=client_stream_.recv_n (recv_buff, sizeof(recv_buff));<br />    if (n == -1) {<br />        ACE_ERROR ((LM_ERROR, "%p \n", "Error in recv"));<br />    }<br />    else {<br />        ACE_DEBUG((LM_DEBUG, "Client received: %s \n", recv_buff));<br />    }<br /><br />    return 0;<br />}<br /><br />int <br />Client::close() <br />{ <br />    if (client_stream_.close () == -1)<br />        ACE_ERROR_RETURN ((LM_ERROR,"(%P|%t) %p \n", "close"),-1);<br />    else<br />        return 0;<br />}<br /><br />static char* SERVER_HOST = "127.0.0.1";<br />static u_short SERVER_PORT = 1009;<br /><br />int main (int argc, char *argv[])<br />{<br />    Client client(SERVER_HOST, SERVER_PORT);<br />    client.connect_to_server();<br />    client.send_to_server();<br />    ACE_OS::sleep (1);<br />    client.close();<br /><br />    return 0;<br />}<br /><br /><br />############################################################################<br />##<br />## Generic Makefile for ACE Program. (sample =&gt; server | client)<br />## <br />## Author: Zhao Dexiang (zdxster AT gmail DOT com)<br />## Date: 2006/05/19<br /><br />### Variables: ###<br />CC = cl.exe<br />RC = rc.exe<br />LINK = link.exe<br />PROGRAM = sample<br />OBJS = .\output<br />EXECFILE = $(OBJS)\$(PROGRAM).exe<br />ACEPATH = F:\ACE_wrappers<br /><br />CMNCCFLAGS = /D "_UNICODE" /D "UNICODE" /Od /D "WIN32" /D "_CONSOLE" /EHsc /GS /W3 /nologo /c /Wp64 /TP<br />CMNLDFLAGS = /NOLOGO /SUBSYSTEM:CONSOLE /MACHINE:X86 /pdb:"$(OBJS)\$(PROGRAM).pdb" /out:"$(EXECFILE)"<br />CMNLDLIBS = kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib<br /><br />!IF "$(BUILD)" == ""<br />BUILD = Debug<br />!ENDIF<br /><br />!IF "$(BUILD)" == "Release"<br />CCFLAGS = $(CMNCCFLAGS) /MD /FD /Zi /D "NDEBUG"<br />EXTRAFLAGS = /I $(ACEPATH) /I.<br />LDFLAGS = $(CMNLDFLAGS) /INCREMENTAL:NO<br />LDPATH = $(ACEPATH)\lib<br />LDLIBS = $(CMNLDLIBS) ACE.lib<br /><br />!ELSEIF "$(BUILD)" == "Debug"<br />CCFLAGS = $(CMNCCFLAGS) /Gm /RTC1 /MDd /ZI /D "_DEBUG"<br />EXTRAFLAGS = /I $(ACEPATH) /I.<br />LDFLAGS = $(CMNLDFLAGS) /incremental:yes /debug<br />LDPATH = $(ACEPATH)\lib<br />LDLIBS = $(CMNLDLIBS) ACEd.lib<br />!ENDIF<br /><br />!IF "$(BUILD)" == "Release" || "$(BUILD)" == "Debug"<br />ALL_OBJECTS = \<br />        $(OBJS)\sample.obj    \<br /><br />### Conditionally setting: ###<br />all: $(OBJS)<br />$(OBJS):<br />    -if not exist $(OBJS) mkdir $(OBJS)<br /><br />### Targets: ###<br />all: $(EXECFILE) data<br /><br />clean:<br />    -if exist $(OBJS)\*.obj del $(OBJS)\*.obj<br />    -if exist $(OBJS)\*.res del $(OBJS)\*.res<br />    -if exist $(OBJS)\*.pch del $(OBJS)\*.pch<br />    -if exist $(OBJS)\*.ilk del $(OBJS)\*.ilk<br />    -if exist $(OBJS)\*.pdb del $(OBJS)\*.pdb<br />    -if exist $(OBJS)\$(PROGRAM).exe del $(OBJS)\$(PROGRAM).exe<br /><br />$(EXECFILE): $(ALL_OBJECTS)<br />     $(LINK) /OUT:$@ $(LDFLAGS) $** /LIBPATH:$(LDPATH) $(LDLIBS)<br /><br />data:<br />$(OBJS)\sample.obj: .\sample.cpp<br />    $(CC) $(CCFLAGS) /Fo$@ $(EXTRAFLAGS) $**<br /><br />!ENDIF<br /><br />### End of the Makefile ## All rights reserved ###<br />##################################################<br /><br /><img src ="http://www.cppblog.com/zoadex/aggbug/7412.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zoadex/" target="_blank">Free space</a> 2006-05-19 16:18 <a href="http://www.cppblog.com/zoadex/articles/7412.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>