使用ACE的被动连接方式实现服务器打印功能。服务器采用单线串行处理方式逐个处理客户端的连接请求,连接成功后,服务器从客户端接收10个字符长度的内容,并将其显示在服务器。 #include "stdafx.h" #include "ace/ace.h" #include "ace/SOCK_Acceptor.h" #include "ace/SOCK_Stream.h" #include "ace/Log_Msg.h" #define DATA_LEN 10 /** *接收客户端发送固定长度的文本内容,并将其显示在服务器输出设备 *服务器采用单线程的方式进行数据处理,针对每一个客户请求,服务 *器采用串行处理,直到当前的请求被处理完成后才可以进行下一个客 *户端的连接请求。 */ class Server{ public: Server(int port):inServer(port),saAcceptor(inServer) { pData = new char[DATA_LEN + 1]; } ~Server() { delete[] pData; pData = NULL; } /* *接收来自客户端的连接请求 */ int AcceptConn() { ACE_DEBUG((LM_DEBUG,ACE_TEXT("start server at port:%d/n"),inServer.get_port_number())); while (1) { if (saAcceptor.accept(ssStream) == -1) { ACE_ERROR((LM_ERROR,"%p/n","accept")); continue; } else { HandleConn(); } } return 0; } //处理来自客户端的请求,将其显示在服务器端 void HandleConn() { while(1){ int count = 0; memset(pData,0,DATA_LEN + 1); count = ssStream.recv_n(pData,DATA_LEN,0); if(count == -1 || count == 0) { ACE_ERROR((LM_ERROR,"%p/n","error in recv_n")); return; } else { pData[count] = 0; ACE_DEBUG((LM_DEBUG,"recv data is:%s/n",pData)); } } if (ssStream.close() == -1) { ACE_ERROR((LM_ERROR,ACE_TEXT("%p/n"),"close")); } } private: char* pData; ACE_INET_Addr inServer; ACE_SOCK_Acceptor saAcceptor; ACE_SOCK_Stream ssStream; }; int ACE_TMAIN(int argc, ACE_TCHAR* argv[]) { //建立服务器,监听27002端口 Server PrintServer(27002); PrintServer.AcceptConn(); return 0; } 测试程序还是采用Perl客户端 #!/usr/bin/perl use 5.006; use strict; use warnings; use IO::Socket; my $host = "localhost"; my $port = 27002; my $socket = IO::Socket::INET->new("$host:$port") or die $@; while(defined(my $msg = STDIN->getline)){ print $socket $msg; } $socket->close or die $@;