2008年01月31日

Pingっちゃいます!

本日公開したRawSocketクラス(+Socketクラス)を使ってPINGを打ってみます。以下はWindows/Linux共用です。

色々なサイトを参考にしながら、自分書いていて、なんでWriteするのはICMPヘッダだけで大丈夫なのかな?と思っていて、Microsoftのネットワークモニターツールでパケットをキャプチャすると、IPヘッダが勝手に付加されてる?!不思議!などと思っていたのですが、

プロトコルにIPPROTO_ICMPを指定しているからなんだと、急に気づきました。相当、寝ぼけています猫


#define WIN32_LEAN_AND_MEAN
#include <stdio.h>
#ifdef _WIN32
#include <tchar.h>
#endif
#include "RawSocket.h"

#define ICMP_ECHO_REPLY 0
#define ICMP_ECHO_REQUEST 8

struct reply {
struct iphdr stIpHdr;
struct icmphdr stIcmpHdr;
};

#ifdef _WIN32
int _tmain(int argc, _TCHAR* argv[])
#else
int main()
#endif
{
Socket::StartUp();

RawSocket sock(IPPROTO_ICMP);

sock.Open("localhost");

struct icmphdr stIcmpHdr;
memset( &stIcmpHdr, 0, sizeof(struct icmphdr) );
stIcmpHdr.type = ICMP_ECHO_REQUEST;
stIcmpHdr.code = 0;
stIcmpHdr.un.echo.id = 999;
stIcmpHdr.un.echo.sequence = 0;
stIcmpHdr.checksum = RawSocket::GetIpCheckSum((ushort*)&stIcmpHdr, sizeof(struct icmphdr));

sock.Write(&stIcmpHdr, sizeof(struct icmphdr));

struct reply stReply;
memset( &stReply, 0, sizeof(struct reply) );

sock.Read(&stReply, sizeof(struct reply));

printf(
"ihl %x\n"
"ver %x\n"
"tos %x\n"
"len %x\n"
"id %x\n"
"frag %x\n"
"ttl %x\n"
"proto %x\n"
"check %x\n"
"type %x\n"
"code %x\n"
"check %x\n"
"id %x\n"
"seq %x\n"
,stReply.stIpHdr.ihl
,stReply.stIpHdr.version
,stReply.stIpHdr.tos
,stReply.stIpHdr.tot_len
,stReply.stIpHdr.id
,stReply.stIpHdr.frag_off
,stReply.stIpHdr.ttl
,stReply.stIpHdr.protocol
,stReply.stIpHdr.check
,stReply.stIcmpHdr.type
,stReply.stIcmpHdr.code
,stReply.stIcmpHdr.checksum
,stReply.stIcmpHdr.un.echo.id
,stReply.stIcmpHdr.un.echo.sequence
);
printf("src[%s]\n", Socket::N2A(stReply.stIpHdr.saddr));
printf("dst[%s]\n", Socket::N2A(stReply.stIpHdr.daddr));

sock.Close();

Socket::CleanUp();
return 0;
}
posted by 台北猫々 at 22:01| Comment(0) | TrackBack(1) | 日記

公開しました(RawSocketクラス)。

新たに公開したのは、↓です。
■RawSocketクラス(C/C++)Windows,Linux共用
生ソケットを扱います。IPヘッダから操作することになります。


公開URLはページの→側にもありますが、
http://winter-tail.sakura.ne.jp
です。


良かったらクリックお願いします→banner_01.gif
posted by 台北猫々 at 21:51| Comment(0) | TrackBack(0) | 日記

更新しました(Socketクラス)

生ソケットクラスを作成中なのですが、その過程で必要になった改造を行っています。

2008.1.31 V1.0.5
1.Socket(コンストラクタ)追加
ソケットタイプとプロトコルを指定できるコンストラクタを追加

2.SetSockAddr(protected)更新
引数のポート番号のデータ型をushort→const char*に変更。
ICMPでの通信でポート番号指定無しの場合があるのに対応。

3.Open, Read, Write, Closeメソッド更新
継承時のオーバライドに対応
4.GetSockAddr、GetTimeoutValueアクセスメソッド追加
継承先からアクセスできなかったため。

5.N2Aメソッド追加
inet_ntoaのラップです。



公開URLはページの→側にもありますが、
http://winter-tail.sakura.ne.jp
です。


良かったらクリックお願いします→banner_01.gif
posted by 台北猫々 at 19:44| Comment(0) | TrackBack(0) | 日記

2008年01月30日

更新しました(SocketStreamクラス)。

・SocketStreamクラス v1.0.5
1.IsGetErrorメソッド追加
受信エラー判定用メソッドを追加しました


受信エラー判定用のメソッドが必要なことに気づきました・・・猫


公開URLはページの→側にもありますが、
http://winter-tail.sakura.ne.jp
です。


良かったらクリックお願いします→banner_01.gif
posted by 台北猫々 at 22:06| Comment(0) | TrackBack(0) | 日記

2008年01月29日

公開しました(StdUtilクラス)。

新たに公開したのは、↓です。
■StdUtilクラス(C/C++)Windows,Linux共用
例えばstd::stringの機能を補完したりします。

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

/**
* 文字列分割
* @param src 構文解析される文字列
* @param delim 区切り文字列
* @param out 分割結果配列(OUT)
*/
static void Split(string src, const char* delim, vector& out);

/**
* 文字列分割
* @param src 構文解析される文字列
* @param delim 区切り文字列
* @param env 囲み文字
* @param out 分割結果配列(OUT)
*/
static void Split(string src, const char* delim, const char env, vector& out);

/**
* 半角スペーストリミング
* @param src ソース文字列(IN/OUT)
*/
static void Trim(string &str);

/**
* 文字列の比較(大文字・小文字の違いを無視)
* @param src1 文字列1
* @param src2 文字列2
* @return src1src2:負
*/
static int CompareIgnoreCase(const char* src1, const char* src2 );

/**
* 文字列の比較(大文字・小文字の違いを無視)
* @param src1 文字列1
* @param src2 文字列2
* @param size 比較サイズ
* @return src1src2:負
*/
static int CompareNIgnoreCase(const char* src1, const char* src2, size_t size );




公開URLはページの→側にもありますが、
http://winter-tail.sakura.ne.jp
です。


良かったらクリックお願いします→banner_01.gif
posted by 台北猫々 at 22:01| Comment(0) | TrackBack(0) | 日記

2008年01月28日

最近、C/C++クラスを公開しています。

が、そのためにC/C++言語で久しぶりにコーディングしています。
そこで思うのが、低水準(一昔前では高水準でしたが)の言語で書くのは「楽しい」のですよね。

なんでしょうね?なんか、コンピュータのプログラミングをしているんだという実感というのでしょうか?

また、プログラミングは、プログラマーにとっての自己表現の手段なのだということを、思い出しました。猫
posted by 台北猫々 at 20:50| Comment(0) | TrackBack(0) | 日記

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) | 日記

2008年01月26日

ソフトウエア受託開発業界考察3

今日は「ソフトウエアの適正価格の不透明さ」について少々。

受託システムの価格を決めるのって結構いいかげんですよね。見積もり手法はいくつもありますが、ステップ数から見積もるなんての論外ですし、FP法も経験的にいって、いまいちなんですよね(係数のさじ加減1つですし、IN/OUTのパラメータ数だけでプログラムの難易度を測るのは不確か過ぎます)。

結局のところ金額の根拠が曖昧なために、最終的には相手の思惑・予算に合わせることになります。

さておき、見積もり手法の中で、一番信頼できるのは「類推見積もり法」であると思っています。というのは、システムソフトウエアのように高度な複雑性をもっているものを予測だけで見積もるのは、多分不可能だと思うからです。

実際の現場では、ベテランが「えいやっ!」で出す見積もりは、結構正解だったりするのですが、これは自然に「類推見積もり法」をやっているからです。

そこで、「ソフトウエアの適正価格の不透明さ」に対する私の提案は、完了したソフトウエア開発の情報を集約して管理する公共のデータベースを構築することです。このデータベースには日本で過去行われたソフトウエアの開発プロジェクトの情報が管理されます。各開発会社では、システムの見積もりを行う時にはこのデータベースを検索して、過去の類似したシステムを見つけ、それを元に見積もりを行います。

(長くなったので続く猫


良かったらクリックお願いします→banner_01.gif
posted by 台北猫々 at 22:30| Comment(0) | TrackBack(0) | コラムみたいな

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

新たに公開したのは、↓です。
■正規表現での文字列チェック(Java)
・チェック内容は以下の通り
1.文字列が「ASCII文字」のみか?
2.文字列が「ひらがな」のみか?
3.文字列が「カタカナ」のみか?
4.文字列が「半角カタカナ」のみか?
5.文字列が「全角ASCII文字」のみか?
6.文字列が「全角文字」のみか?
7.文字列にASCII文字でない文字が存在するか?
8.文字列に半角英字でない文字が存在するか?
9.文字列に半角英字でない文字が存在するか?
10.文字列に半角カタカナが存在するか?
11.正しいメールアドレスか?(簡易版です)
12.正しいURLか?
13.正しい郵便番号か?


公開URLはページの→側にもありますが、
http://winter-tail.sakura.ne.jp
です。


良かったらクリックお願いします→banner_01.gif
posted by 台北猫々 at 13:37| Comment(0) | TrackBack(0) | 日記

2008年01月25日

更新しました(Socket、URLEncoderクラス)

・Socketクラス v1.0.4
1.ライセンス
BSDライセンスに変更した。
・URLEncoderクラス v1.0.2
1.ライセンス
ライセンス文の誤りを修正。本文中の団体名が間違っていた。


公開URLはページの→側にもありますが、
http://winter-tail.sakura.ne.jp
です。
posted by 台北猫々 at 00:04| Comment(0) | TrackBack(0) | 日記

2008年01月24日

なんでだろう?

ブログのアクセス解析で検索エンジンを見ると、ほとんどGoogleなんですよね。他の検索エンジンは、たまに見かける程度なんですよ。

この偏りの原因は、なんだろう?猫
posted by 台北猫々 at 21:35| Comment(0) | TrackBack(0) | 日記

更新しました(SocketStreamクラス)

・SocketStreamクラス v1.0.4
1.GetLineメソッド更新
IsEOFの位置を変更しました。変更前では、EOFを検知した後にreturn ""していたので、EOFがあると空文字列が返ってしまった。

2.ライセンス
ライセンス文の誤りを修正。本文中の団体名が間違っていた。


猫バグってました・・・

公開URLはページの→側にもありますが、
http://winter-tail.sakura.ne.jp
です。

良かったらクリックお願いします→banner_01.gif
posted by 台北猫々 at 19:52| Comment(0) | TrackBack(0) | 日記

2008年01月23日

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

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

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

/**
* 文字列を URL encodeする.
* @param s - ソース文字列
* @return encoded文字列
*/
static string Encode(const string &s) {

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

Windows環境のJavaでドライブ名のリスト

昔にWindows環境のJavaでドライブリスト(C:\\, D:\\・・)の取得の仕方を調べていて、

FileSystemView fileSystemView = FileSystemView.getFileSystemView();
File[] roots = fileSystemView.getRoots();

とすれば、とれるというWeb情報があったので、試して、だけど駄目で諦めていたのですが、先日ひょっこり方法を見つけました。

なんのことはない、Fileクラスのメソッドにあるのですね。


import java.io.File;

public class GetRoot {

/**
* @param args
*/
public static void main(String[] args) {
// TODO 自動生成されたメソッド・スタブ
File[] roots = File.listRoots();
for( File f : roots ) {
System.out.println(f.getPath());
}
}

}
posted by 台北猫々 at 20:27| Comment(0) | TrackBack(0) | 技術メモ(Java)

2008年01月22日

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

新たに公開したのは、↓です。
■サーバーソケットクラス(C/C++)Windows,Linux共用
JavaのServerSocketクラスに近いものです。ソケットサーバで使用することを想定しています。

今まで公開しているSocket、SocketStreamクラスを併用すると、以下のように簡便にソケットサーバを作成できます。

以下のサーバは、ポート8080で接続待機して、クライアントから受け取ったデータ(文字列)を標準出力し、"end"を受信すると終了します。


#define WIN32_LEAN_AND_MEAN
#include
#ifdef _WIN32
#include
#endif
#include

#include "ServerSocket.h"
#include "SocketStream.h"

#ifdef _WIN32
int _tmain(int argc, _TCHAR* argv[])
#else
int main()
#endif
{
Socket::StartUp();

ServerSocket server;
server.Listen(8080);

while(1) {
Socket cli = server.Accept();
if( !cli.isOK() ) {
printf("Invalid Socket!\n");
break;
}

SocketStream stream;
stream.Open(cli);

char buf[64];
stream.GetLine(buf, sizeof(buf));

printf("[%s]\n", buf);

stream.Close();

if( !strcmp(buf, "end") ) {
break;
}
}
server.Close();

Socket::CleanUp();
return 0;
}

posted by 台北猫々 at 21:40| Comment(0) | TrackBack(0) | 日記

更新しました(SocketStreamクラス)

・SocketStreamクラス v1.0.3
1.GetLineメソッド追加
1行の長さが不定のデータに対応するため、戻り値をstd::stringにしたものを追加した。

2.IsEOFメソッド追加
ストリームを終了を判定するメソッドを追加した。

3.ライセンス
BSD licenseに変更した。

4.GetReadStreamメソッド(protected)
5.GetWriteStreamメソッド(protected)
継承して拡張するように、ファイルポインタ取得メソッドを追加した。
posted by 台北猫々 at 20:59| Comment(0) | TrackBack(0) | 日記

BSDライセンスに切り替えよう

最近、公開しているC/C++などのクラスのライセンスをGPLv3にしていたのですが、勘違いしてしまっていました。

GPLv3は再頒布に制限があるのですね(ないかと思っていました(^^;)。
http://ja.wikipedia.org/wiki/GNU_General_Public_License#.E3.83.90.E3.83.BC.E3.82.B8.E3.83.A7.E3.83.B33

特別な処理が入っているわけではないので、BSDライセンスに随時切り替えようと思っています。

ライセンスもしっかり勉強しないと駄目駄目ですね猫


良かったらクリックお願いします→banner_01.gif
posted by 台北猫々 at 19:04| Comment(0) | TrackBack(0) | 日記

2008年01月21日

更新しました(Socketクラス、SocketStreamクラス)

2008.01.21 更新
・SocketStreamクラス v1.0.2
1.Closeメソッド更新
Socketクラスのソケットハンドルのみを閉じるように変更しました。他のソケットハンドルから派生しているファイルハンドルやファイルポインタを閉じると、WSACleanup()でAbortしてしまうため(ただし、Debugモードでのみ)詳細は不明。オオモトとしたソケットハンドルを閉じることで、派生したファイルハンドル(_open_osfhandle)やファイルポインタ(fdopen)は自動的に閉じる模様。
2.GetLineメソッド更新
3.TrimLineFeedメソッド追加
GetLineメソッドに改行コードトリミング実行フラグを追加。TrimLineFeedメソッドは改行コード('\r','\n')のトリミング処理を行う。


2008.01.20 更新
・Socketクラス v1.0.3
1.Socket(コンストラクタ)更新
2.StartUpメソッド追加
Windowsにおける二重初期化(WSAStartup)を回避するため、WSAStartupとsetsocketoptionは、別途StartUpメソッドで行うように変更。

3.~Socket(デストラクタ)更新
4.CleanUpメソッド追加
Windowsにおける二重後処理(WSACleanup)を回避するため、WSACleanupは、別途CleanUpメソッドで行うように変更。

5.~Socket(デストラクタ)更新
Closeメソッドを呼び出さないように変更。Socketインスタンスをあるメソッドからコピーで返却しようとすると、デストラクタが呼ばれてソケットが閉じてしまうため。

6.定義値close変更
定義名をCLOSE_SOCKETに変更した。closeだと<io.h>のcloseと競合するため。

7.IsOKメソッド追加
正常なSocketインスタンスかチェックする(ソケットハンドルのチェック)。


公開URLはページの→側にもありますが、
http://winter-tail.sakura.ne.jp
です。

良かったらクリックお願いします→banner_01.gif
posted by 台北猫々 at 19:13| Comment(0) | TrackBack(0) | 日記

2008年01月20日

ことの葉ひらひら その17

「ザクとは違うのだよザクとは」

ランバ・ラル


世代交代を表わす言葉ですね。
posted by 台北猫々 at 22:31| Comment(0) | TrackBack(0) | ことの葉