现在,我们用前面所构建的socket类,重新设计第一章中echo的服务器,然后设计客户端程序。

       echo服务器的工作原理很简单:

       1、接收客户端传来的信息;

       2、将接收到的信息原封不动的返回给客户端。

       可以看到我们所设计的TCPServerSock类具备了echo服务的所有数据成员,我们只需要添加一个具体的echo方法。因此,我们让设计的echo类从TCPServerSock类中派生出来。

C++代码
  1. //Filename AppSock.hpp  
  2.   
  3. #ifndef APP_SOCK_HPP  
  4. #define APP_SOCK_HPP  
  5.   
  6. #include "SockClass.hpp"  
  7.   
  8. class TCPEchoServer: public TCPServerSock{  
  9. public:  
  10.     TCPEchoServer(  
  11.         const TCPListenSock& listen_sock,  
  12.         int pre_buffer_size = 32);  
  13.     ~TCPEchoServer();  
  14.     bool handEcho() const;  
  15. };  
  16.   
  17. #endif //AppSock.hpp  

       将handEcho()设计成返回值为bool是出于以下考虑:因为服务器端通常是无限循环提供服务的,我们希望客户端能简单的对服务器端的控制,比如说进行关闭,这样就不用每次用Ctrl+c来关闭服务器端的程序。所以,handlEcho()返回true表示客户端正常断开,false表示服务器被要求终止。

C++代码
  1. //Filename: AppSock.cpp  
  2.   
  3. #include <string>  
  4. #include "AppSock.hpp"  
  5.   
  6. TCPEchoServer::TCPEchoServer(const TCPListenSock& listen_sock, int pre_buffer_size):  
  7. TCPServerSock(listen_sock, pre_buffer_size)  
  8. {}  
  9.   
  10. TCPEchoServer::~TCPEchoServer()  
  11. {}  
  12.   
  13. bool TCPEchoServer::handEcho() const  
  14. {  
  15.     const std::string SHUTDOWN_CMD = "/shutdown";  
  16.     while (TCPReceive() > 0) {  
  17.         std::string cmd(preBuffer, SHUTDOWN_CMD.size());  
  18.         if (cmd == SHUTDOWN_CMD && preReceivedLength == (int)SHUTDOWN_CMD.size()) {  
  19.             return false;  
  20.         }  
  21.         TCPSend(preBuffer, preReceivedLength);  
  22.     }  
  23.     return true;  
  24. }  

       我们为服务器指定一个关闭的的特殊字符串/shutdown,如果客户端传来这个字符串,服务器就会终止;其他字符串则会履行echo服务。

       最后我们设计主程序:

C++代码
  1. //Filename: main.cpp  
  2.   
  3. #include "SockClass.hpp"  
  4. #include "AppSock.hpp"  
  5.   
  6. int main(int argc, char* argv[])  
  7. {  
  8.     const unsigned short DEFAULT_PORT = 5000;  
  9.     unsigned short listen_port = DEFAULT_PORT;  
  10.     if (argc == 2 && atoi(argv[1]) > 0) {  
  11.         listen_port = atoi(argv[1]);  
  12.     }  
  13.   
  14.     TCPListenSock listen_sock(listen_port);  
  15.     listen_sock.TCPListen();  
  16.   
  17.     bool go_on = true;  
  18.     while (go_on){  
  19.         TCPEchoServer echo_server(listen_sock);  
  20.         go_on = echo_server.handEcho();  
  21.     }  
  22.   
  23.     return 0;  
  24. }  

       主程序以第一个参数(argv[1])来指定服务器端口,如果不指定,则默认端口是5000。 

除非特别注明,鸡啄米文章均为原创
转载请标明本文地址:http://www.teaching4real.com/software/452.html
2015年10月30日
作者:鸡啄米 分类:软件开发 浏览: 注册送白菜网:1