2008年01月27日

公開クラスでEcho(ソケット)サーバを作ります。

公開しているC++クラスで簡単なソケットサーバを作成してみます。作成するファイル・クラスは以下の通り、
(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
です。
posted by 台北猫々 at 18:24| Comment(0) | TrackBack(0) | 技術メモ
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/10101254

この記事へのトラックバック