現在,我們用前面所構建的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://dnsf85p.top/software/452.html
2015年10月30日
作者:雞啄米 分類:軟件開發 浏覽: 評論:1