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