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) | 技術メモ

公開しました(Base64Encoderクラス)

新たに公開したのは、↓です。
■Base64エンコード/デコードクラス(C/C++)Windows,Linux共用

以下のメソッドを提供します。

/**
* 文字列を BASE64 encodeする.
* @param src - ソース文字列
* @return encoded文字列
*/
static string Encode(string& src);

/**
* BASE64 encodedな文字列を復号化する.
* @param src - ソース文字列
* @return decoded文字列
*/
static string Decode(string& src);
posted by 台北猫々 at 09:12| Comment(0) | TrackBack(0) | 日記