? ? ? ?现在,我们用前面所构建的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???
  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。?

除非特别注明,鸡皇冠现金官网hg6388|首页文章均为原创
转载请标明本文地址:http://www.jizhuomi.com/software/452.html
2015年10月30日
作者:鸡皇冠现金官网hg6388|首页 分类:软件开发 浏览: 评论:1