現在,我們用前面所構建的socket類,重新設計第一章中echo的服務器,然后設計客戶端程序。
echo服務器的工作原理很簡單:
1、接收客戶端傳來的信息;
2、將接收到的信息原封不動的返回給客戶端。
可以看到我們所設計的TCPServerSock類具備了echo服務的所有數據成員,我們只需要添加一個具體的echo方法。因此,我們讓設計的echo類從TCPServerSock類中派生出來。
//Filename AppSock.hpp
#ifndef APP_SOCK_HPP
#define APP_SOCK_HPP
#include "SockClass.hpp"
class TCPEchoServer: public TCPServerSock{
public:
TCPEchoServer(
const TCPListenSock& listen_sock,
int pre_buffer_size = 32);
~TCPEchoServer();
bool handEcho() const;
};
#endif //AppSock.hpp
將handEcho()設計成返回值為bool是出于以下考慮:因為服務器端通常是無限循環提供服務的,我們希望客戶端能簡單的對服務器端的控制,比如說進行關閉,這樣就不用每次用Ctrl+c來關閉服務器端的程序。所以,handlEcho()返回true表示客戶端正常斷開,false表示服務器被要求終止。
//Filename: AppSock.cpp
#include <string>
#include "AppSock.hpp"
TCPEchoServer::TCPEchoServer(const TCPListenSock& listen_sock, int pre_buffer_size):
TCPServerSock(listen_sock, pre_buffer_size)
{}
TCPEchoServer::~TCPEchoServer()
{}
bool TCPEchoServer::handEcho() const
{
const std::string SHUTDOWN_CMD = "/shutdown";
while (TCPReceive() > 0) {
std::string cmd(preBuffer, SHUTDOWN_CMD.size());
if (cmd == SHUTDOWN_CMD && preReceivedLength == (int)SHUTDOWN_CMD.size()) {
return false;
}
TCPSend(preBuffer, preReceivedLength);
}
return true;
}
我們為服務器指定一個關閉的的特殊字符串/shutdown,如果客戶端傳來這個字符串,服務器就會終止;其他字符串則會履行echo服務。
最后我們設計主程序:
//Filename: main.cpp
#include "SockClass.hpp"
#include "AppSock.hpp"
int main(int argc, char* argv[])
{
const unsigned short DEFAULT_PORT = 5000;
unsigned short listen_port = DEFAULT_PORT;
if (argc == 2 && atoi(argv[1]) > 0) {
listen_port = atoi(argv[1]);
}
TCPListenSock listen_sock(listen_port);
listen_sock.TCPListen();
bool go_on = true;
while (go_on){
TCPEchoServer echo_server(listen_sock);
go_on = echo_server.handEcho();
}
return 0;
}
主程序以第一個參數(argv[1])來指定服務器端口,如果不指定,則默認端口是5000。
本節源代碼下載:
Linux:
http://www.163pan.com/files/c0x000g0o.htmlwin32:
http://www.163pan.com/files/c0x000g0q.html
posted on 2010-06-08 10:56
lf426 閱讀(3194)
評論(3) 編輯 收藏 引用 所屬分類:
SDL入門教程 、
socket 編程入門教程