? ? ? ?与TCP版的Echo Server类似,我们从Server Socket类中派生出Echo Server类。

C++代码
  1. class?UDPEchoServer:?public?UDPServerSock{??
  2. public:??
  3. ????explicit?UDPEchoServer(??
  4. ????????????????unsigned?short?server_port,??
  5. ????????????????int?pre_buffer_size?=?32);??
  6. ????~UDPEchoServer();??
  7. ????bool?handEcho();??
  8. };??

? ? ? ?我们依然让handEcho()返回一个bool,true表示客户端“正常”离开(这里没用“断开”这个词是因为UDP是无连接的;另外,我们这里用recvfrom()返回小于0来表示客户端其实是“非正常”的离开了,比如连接被重置。事实上,作为UDP服务器,根本不关心客户端是在连还是已经离开),false表示客户端发出指令要求服务器端关闭。

C++代码
  1. UDPEchoServer::UDPEchoServer(??
  2. ????????????????unsigned?short?server_port,??
  3. ????????????????int?pre_buffer_size):??
  4. UDPServerSock(server_port,?pre_buffer_size)??
  5. {}??
  6. ??
  7. UDPEchoServer::~UDPEchoServer()??
  8. {}??
  9. ??
  10. bool?UDPEchoServer::handEcho()??
  11. {??
  12. ????const?std::string?SHUTDOWN_CMD?=?"/shutdown";??
  13. ????while?(UDPReceive()?>=?0)?{??
  14. ????????std::string?cmd(preBuffer,?SHUTDOWN_CMD.size());??
  15. ????????if?(cmd?==?SHUTDOWN_CMD?&&??
  16. ????????????preReceivedLength?==?static_cast<int>(SHUTDOWN_CMD.size()))?{??
  17. ????????????return?false;??
  18. ????????}??
  19. ????????std::cout????<"Client?(?"??
  20. ????????????????????<
  21. ????????????????????<"?:?"??
  22. ????????????????????<
  23. ????????????????????<"?)?sent?a?message."??
  24. ????????????????????<
  25. ????????UDPSetDest(lastfromSockAddr);??
  26. ????????UDPSendtoDest(preBuffer,?preReceivedLength);??
  27. ????}??
  28. ????return?true;??
  29. }??

? ? ? ?这里跟TCP有些细微的差别。在TCP中,recv()返回0表示连接正常断开,而UDP中没有连接和断开的概念,recv()或者recvfrom()返回0表示收到一个0字节大小数据的数据报。另外,因为TCP是一对一连接的,所以一旦连接上,TCP服务器只能处理来自一个客户端的echo请求(后面会讲到多线程的使用,就可以让TCP同时处理多个客户端了);而UDP服务器则可以处理来自任何客户端的echo请求,为了返回信息到正确的客户端,我们的策略是,接收一个UDP数据包后,马上刷新发送目标地址为上一次接收地址,然后再回发数据,所以这里每次多了一个重新指定发送目的地的函数。

? ? ? ?最后,主程序基本不需要改变:

C++代码
  1. int?main(int?argc,?char*?argv[])??
  2. {??
  3. ????const?unsigned?short?DEFAULT_PORT?=?5000;??
  4. ????unsigned?short?server_port?=?DEFAULT_PORT;??
  5. ????if?(argc?==?2?&&?atoi(argv[1])?>?0)?{??
  6. ????????server_port?=?atoi(argv[1]);??
  7. ????}??
  8. ??
  9. ????UDPEchoServer?echo_server(server_port);??
  10. ??
  11. ????bool?go_on?=?true;??
  12. ????while?(go_on){??
  13. ????????go_on?=?echo_server.handEcho();??
  14. ????}??
  15. ??
  16. ????return?0;??
  17. } ?
除非特别注明,鸡皇冠现金官网hg6388|首页文章均为原创
转载请标明本文地址:http://www.jizhuomi.com/software/472.html
2015年11月30日
作者:鸡皇冠现金官网hg6388|首页 分类:软件开发 浏览: 评论:0