(1)main.cpp
(2)WorkerThread.h
(3)SocketServerBase.cpp, SocketServerBase.h
これで、Echoサーバ的なものができます。サーバはクライアントから接続を受け付けると、ワーカースレッドを起動して処理を委託して、自身は新たな接続を待ちます。
===========================
(1)main.cpp
#include
#include
#include "SocketServerBase.h"
#ifdef _WIN32
int _tmain(int argc, _TCHAR* argv[])
#else
int main()
#endif
{
SocketServerBase server;
server.Start(8080);
return 0;
}
(2)WorkerThread.h
#include "SocketStream.h"
#include "Thread.h"
class WorkerThread : public Thread{
public:
WorkerThread(Socket* cli) {m_pclClient = cli;}
void Start() {
Thread::Start(Run, this);
}
static int Run(void* pParam){
//TODO スレッド処理
WorkerThread* p = (WorkerThread*)pParam;
//ソケットをストリームに変換します。
SocketStream stream;
stream.Open(*(p->m_pclClient));
//クライアントからのデータを受信します。
string str = stream.GetLine();
//クライアントから受信した文字列を表示します。
printf("[%s]\n", str.c_str());
//受信した文字列を、そのままクライアントに返します。
stream.PutlLine(str.c_str());
stream.Close();
return 0;
}
private:
Socket* m_pclClient;
};
(3)SocketServerBase.cpp
※SocketServerBase.hはクラス定義のみです。
int SocketServerBase::Start(ushort portNo) {
Socket::StartUp();
Listen(portNo);
while(1) {
Socket cli = Accept();
if( !cli.isOK() ) {
printf("Invalid Socket!\n");
break;
}
WorkerThread th(&cli);
th.Start();
th.Detach();
}
Close();
Socket::CleanUp();
return 0;
}
公開URLはページの→側にもありますが、
http://winter-tail.sakura.ne.jp
です。