More servicesWindows Live
HomeHotmailSpacesOneCare
 
MSN
Sign in
 
 
Spaces home  TheOnly Visual SpacePhotosProfileFriendsMore Tools Explore the Spaces community

TheOnly Visual Space

Updated 3/15/2007
February 21

春节电影

春节电影目录:
<<落叶归根>>
<<加勒比海盗2>>
<<搏击俱乐部>>
<< 博物馆奇妙之夜>>
<<爱情呼叫转移>>:
//www.tudou.com/search/playlist/?posto=%2Fsearch%2Fplaylist%2F&kw=%B0%AE%C7%E9%BA%F4%BD%D0%D7%AA%D2%C6&nav_search_target=0&comefrom=1&x=38&y=15
 
 
 
February 18

年度人物中最经典的一句话

政治家就象尿布,得勤换勤洗.

在上海过春节

  又到除夕了.
  今年过年没有回家,在上海过亲戚家过的年.
  以前小时候,最开心的时候就是拿红包了,今年应该是我拿红包了.看到小朋友们拿红包的开心样子,就想到了我小时候,心里还是蛮开心的.不过已经没有了小时侯对过年的那种向往,更多的是一种对亲情的依恋.也许只有人有了一定的社会责任感以后,才会更明白亲情的意义和家的意义.以前也许会说哪哪儿的年夜饭做得最好吃,不过现在觉得一家人吃饭的感觉是最重要的.
  两个弟弟在部队里面,或许更加想家.曾浩刚刚过了考核,张俊已经做了班长.听他们电话的时候发现已经成熟了很多.以前在拿压岁钱打游戏,放鞭炮的日子已经一回了,男孩子都慢慢变成男人.
  
  
January 06

Tracert 的代码

Source code of Tracert.
More information about ICMP protocol, please refer to the document of RFC.
 
--------------------------------------------------------------------------------------------------
General.h
#include <windows.h>
#ifdef __GENERAL_H__
#define __GENERAL_H__
// CRC Check Sum
extern USHORT ip_checksum(USHORT* buffer, int size);
// Read IP Address from Integer to String
void ReadIPAddress(unsigned long IPAddress);
#endif  // GENERAL_H
 
----------------------------------------------------------------------------------------------------
General.cpp

#include "General.h"
#include <stdio.h>

USHORT ip_checksum(USHORT* buffer, int size)
{
    unsigned long cksum = 0;
   
    // Sum all the words together, adding the final byte if size is odd
    while (size > 1) {
        cksum += *buffer++;
        size -= sizeof(USHORT);
    }
    if (size) {
        cksum += *(UCHAR*)buffer;
    }

    // Do a little shuffling
    cksum = (cksum >> 16) + (cksum & 0xffff);
    cksum += (cksum >> 16);
   
    // Return the bitwise complement of the resulting mishmash
    return (USHORT)(~cksum);
}

void ReadIPAddress(unsigned long IPAddress)
{
    printf("%d.%d.%d.%d\n", UCHAR(IPAddress),
                                       UCHAR(IPAddress >> 8),
                                       UCHAR(IPAddress >> 16),
                                       UCHAR(IPAddress >> 24));
}

----------------------------------------------------------------------------------------------------------

ICMP.h

#include <windows.h>
#ifndef __ICMP_H__
#define __ICMP_H__

#define ICMP_ECHO 8               // Echo ICMP Packet
#define ICMP_REPLAY 0             // Replay ICMP Packet
#define MAX_DATA_SIZE 1024         
#define ICMP_MIN 8                
#define ICMP_TIMEOUT 11           // Time out ICMP Packet
#define DEFAULT_ICMP_SIZE 44      // The Default ICMP Packet Size

#pragma pack(1)
typedef struct tagICMPHeader
{
    UCHAR type;
    UCHAR code;
    USHORT checkSum;
    USHORT ID;
    USHORT SeqNumber;
}ICMPHeader, *PICMPHeader;
#pragma pack()

#pragma pack(1)
typedef struct tagIPHeader
{
    BYTE h_len:4;
    BYTE version:4;
    BYTE tos;
    USHORT total_len;
    USHORT ID;
    USHORT flags;
    BYTE ttl;
    BYTE proto;
    USHORT checksum;
    ULONG source_ip;
    ULONG dest_ip;
}IPHeader, *PIPHeader;
#pragma pack()

#endif  // ICMP_H

-------------------------------------------------------------------------------------------------------

Tracert.h

#include "ICMP.H"
#include "General.h"
#include <iostream>
using namespace std;

#ifndef __TRACERT_H__
#define __TRACERT_H__

#define TRACERT_DATA_PART_SIZE (DEFAULT_ICMP_SIZE - sizeof(ICMPHeader))
#pragma pack(1)
typedef struct tagTracertPacket
{
    ICMPHeader icmp_header;
    BYTE data_part[TRACERT_DATA_PART_SIZE];
}TracertPacket, *PTracertPacket;
#pragma pack()

class Tracert
{
public:
    Tracert();
    ~Tracert();
    BOOL StartClient();

private:
    void PackTracertPacket(TracertPacket& tracert_packet);
    int UnPackTracertPacketPacket();
    int Configuration();
    int ReceivePacket();
    int SendPacket();
    DWORD InitializeConnection();
    int UnitializeConnection();
    int DecodeTracertPacket(const IPHeader& ip_header, const int recvPacketLen);
    friend USHORT ip_checksum(USHORT* buffer, int size);
    friend void ReadIPAddress(unsigned long IPAddress);

private:
    SOCKET sock;
    sockaddr_in dest;
    sockaddr_in source;
};

#endif  // TRACERT_H

 
-------------------------------------------------------------------------------------------------------
Tracert.cpp

#define  WIN32_LEAN_AND_MEAN
#include <winsock2.h>                     //Need the support of WinSock2
#include <ws2tcpip.h>                     //When setting the level of IPPROTO_IP                                        
#include "Tracert.h"           
#define TRANSFER_OVER 0x05      
static const TCHAR* DEFAULT_ADDRESS = TEXT("220.181.18.155");   // BaiDu Address
static const int TIMEOUT = 1000;                               // 1 second
Tracert::Tracert()
{
    InitializeConnection();
}
 
Tracert::~Tracert()
{
    UnitializeConnection();
}
 
int Tracert::Configuration()
{
    int ttl = TIMEOUT;
 
    if (setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (const char*)&ttl,
            sizeof(ttl)) == SOCKET_ERROR)
    {
        cout << "Error in Configuration, error code:" <<  GetLastError() << endl;
        return GetLastError();
    }
    memset(&dest, 0, sizeof(dest));
    dest.sin_family = AF_INET;
    dest.sin_addr.s_addr = inet_addr(DEFAULT_ADDRESS);
    return 0;
}
 
int Tracert::SendPacket()
{
    static int livetime = 1;
    int retValue=setsockopt(sock,IPPROTO_IP,IP_TTL,(char *)&livetime,sizeof(int));
    if (retValue < 0)
    {
        cout << "Error in Set Tracert Packet Time, error code" << GetLastError() << endl;
        return GetLastError();
    }
    else
    {
        livetime++;
    }
    TracertPacket tracert_packet;
    PackTracertPacket(tracert_packet);
    retValue = sendto(sock,                          // Socket
                      (const char*)&tracert_packet,  // Buffer
                      sizeof(tracert_packet)
                      0,                             // Flag
                      (const sockaddr*)&dest,        // The Pointer to Socket Address
                      sizeof(dest));                 // Size of Socket Address
    if (retValue < 0)
    {
        cout << "Error in send Packet, error code" << GetLastError() << endl;
        return GetLastError();
    }
    return 0;
}
 
int Tracert::ReceivePacket()
{
    // effetive will be worse?
    IPHeader* recv_buf = (IPHeader*)new TCHAR[MAX_DATA_SIZE];
    if (recv_buf == NULL)
    {
        return GetLastError();
    }
    int fromlen = sizeof(source);
    int retValue = recvfrom(sock,
                            (char*)recv_buf,
                            MAX_DATA_SIZE,
                            0,
                            (sockaddr*)&source,
                            &fromlen);
    if (retValue < 0)
    {
        cout << "Error in receive packet, error code" << GetLastError() << endl;
        return GetLastError();
    }
    else
    {
        // Decode ping packet
        retValue = DecodeTracertPacket(*recv_buf, retValue);
    }
    delete []recv_buf;
    recv_buf = NULL;
    return retValue;
}
 
void Tracert::PackTracertPacket(TracertPacket &tracert_packet)
{
    //static USHORT ID = 1;
    static USHORT SeqNumber = 1;
    tracert_packet.icmp_header.type = ICMP_ECHO;
    tracert_packet.icmp_header.code = 0;
    tracert_packet.icmp_header.checkSum = 0;
    tracert_packet.icmp_header.ID = (USHORT)GetCurrentProcessId();
    tracert_packet.icmp_header.SeqNumber = SeqNumber++;
    memset(tracert_packet.data_part, 'E', TRACERT_DATA_PART_SIZE);
    tracert_packet.icmp_header.checkSum = ip_checksum((USHORT*)&tracert_packet, sizeof(tracert_packet));
}
 
int Tracert::DecodeTracertPacket(const IPHeader &ip_header, const int recvPacketLen)
{
    USHORT ipheader_len = ip_header.h_len * 4;
    if (recvPacketLen < ipheader_len + ICMP_MIN)
    {
        // Packet is too small
        cout << "Receive packet is too small" << endl;
        return -1;
    }
   
    TracertPacket *tracertpacket = (TracertPacket*)((char*)&ip_header + ipheader_len);
    if (tracertpacket == NULL)
    {
        cout << "ICMP Header is NULL" << endl;
        return -1;
    }
 
    if (tracertpacket->icmp_header.type == ICMP_TIMEOUT && tracertpacket->icmp_header.code == 0)
    {
        //cout << "Reply Packet" << endl;
        //cout << "time:" << int (GetTickCount() - pingpacket->dwTime) << endl;
        cout << "Route Address:";
        ReadIPAddress(ip_header.source_ip);
    }
   
    if(tracertpacket->icmp_header.type==ICMP_REPLAY &&
       tracertpacket->icmp_header.ID==GetCurrentProcessId())
    {
        //printf("%2d:        %-15s       %4dms\n",icmpcount++,
        //       inet_ntoa(from->sin_addr),tick-cStartTickCount);
        cout << "Route Address:";
        ReadIPAddress(ip_header.source_ip);
        printf("Trace complete!\n");
        return TRANSFER_OVER;
    }
    return 0;
}
 
BOOL Tracert::StartClient()
{
    int flag = 0;
    while(true)
    {
        if (SendPacket())
        {
            return FALSE;
        }
        flag = ReceivePacket();
        if (flag == TRANSFER_OVER)
        {
            return TRUE;
        }
        else if (flag)
        {
            return FALSE;
        }
        Sleep(1000);
    }
    return TRUE;
}
 
DWORD Tracert::InitializeConnection()
{
    cout << "+Initialize Connection!" << endl;
    WSAData wsaData;
    if (WSAStartup(MAKEWORD(1, 1), &wsaData) != 0)
    {
        cout << "Startup error!" << endl;
        return GetLastError();
    }
    sock = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
    if (sock < 0)
    {
        cout << "Create socket error!" << endl;
        return GetLastError();
    }
    if (Configuration())
    {
        return GetLastError();
    }
    cout << "-Initialize Connection!" << endl;
    return 0;
}
 
int Tracert::UnitializeConnection()
{
    WSACleanup();
    closesocket(sock);
    cout << "Unitialize Connection!" << endl;
    return 0;
}
 
int Tracert::UnPackTracertPacketPacket()
{
    return 0;
}
-------------------------------------------------------------------------------------------------------------
main.cpp
 
#include "Tracert.h"
int main()
{
    Tracert tracert_Program;
    tracert_Program.StartClient();
    return 0;
}

Ping的代码

 
Source code of Ping Program. 
Have not test complete yet, more information about Ping and ICMP protocol, please refer to
related website.
 
Please link library WS2_32.LIB at first.
 
// ICMP.h
#include <windows.h>
#ifndef __ICMP_H__
#define __ICMP_H__

#define ICMP_ECHO 8
#define ICMP_REPLAY 0
#define MAX_DATA_SIZE 32
#define ICMP_MIN 8
#pragma pack(1)
typedef struct tagICMPHeader
{
    UCHAR type;
    UCHAR code;
    USHORT checkSum;
    USHORT ID;
    USHORT SeqNumber;
}ICMPHeader, *PICMPHeader;
#pragma pack()
#pragma pack(1)
typedef struct tagIPHeader
{
    BYTE h_len:4;
    BYTE version:4;
    BYTE tos;
    USHORT total_len;
    USHORT ID;
    USHORT flags;
    BYTE ttl;
    BYTE proto;
    USHORT checksum;
    ULONG source_ip;
    ULONG dest_ip;
}IPHeader, *PIPHeader;
#pragma pack()
#endif  // ICMP_H
 
// Ping.h
#include "ICMP.H"
#include <iostream>
using namespace std;
#ifndef __PING_H__
#define __PING_H__
#pragma pack(1)
typedef struct tagPingPacket
{
    ICMPHeader icmp_header;
    DWORD dwTime;
}PingPacket, *PPingPacket;
#pragma pack()
class Ping
{
public:
    Ping();
    ~Ping();
    BOOL StartClient();
 
private:
    void PackPingPacket(PingPacket& ping_packet);
    int UnPackPingPacket();
    int Configuration();
    int ReceivePacket();
    int SendPacket();
    DWORD InitializeConnection();
    int UnitializeConnection();
    DecodePingPacket(const IPHeader& ip_header, const int recvPacketLen);
    friend USHORT ip_checksum(USHORT* buffer, int size);
    friend void ReadIPAddress(unsigned long IPAddress);
private:
    SOCKET sock;
    sockaddr_in dest;
    sockaddr_in source;
};
#endif  // PING_H
 
PING.cpp
#include "PING.H"
const TCHAR* DEFAULT_ADDRESS = TEXT("220.181.27.48");   // LocalHost
const int TIMEOUT = 1000;                                // 1 second
Ping::Ping()
{
    InitializeConnection();
}
Ping::~Ping()
{
    UnitializeConnection();
}
BOOL Ping::StartClient()
{
    while(true)
    {
        if (SendPacket())
        {
             return FALSE;
        }
        if (ReceivePacket())
        {
            return FALSE;
        }
        Sleep(1000);
    }
    return TRUE;
}
 
DWORD Ping::InitializeConnection()
{
    cout << "Initialize Connection!" << endl;
    WSAData wsaData;
    if (WSAStartup(MAKEWORD(1, 1), &wsaData) != 0)
    {
        cout << "Startup error!" << endl;
        return GetLastError();
    }
    sock = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
    if (sock < 0)
    {
        cout << "Create socket error!" << endl;
        return GetLastError();
    }
 
    if (Configuration())
    {
        return GetLastError();
    }
 
    return 0;
}
 
int Ping::Configuration()
{
    int ttl = TIMEOUT;
 
    if (setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (const char*)&ttl, sizeof(ttl)) == SOCKET_ERROR)
    {
        cout << "Error in Configuration, error code:" <<  GetLastError() << endl;
        return GetLastError();
    }
 
    memset(&dest, 0, sizeof(dest));
    dest.sin_family = AF_INET;
    dest.sin_addr.s_addr = inet_addr(DEFAULT_ADDRESS);
    return 0;
}
 
int Ping::UnitializeConnection()
{
    WSACleanup();
    closesocket(sock);
    cout << "Unitialize Connection!" << endl;
    return 0;
}
 
void Ping::PackPingPacket(PingPacket& ping_packet)
{
    static USHORT ID = 1;
    static USHORT SeqNumber = 1;
    ping_packet.icmp_header.type = ICMP_ECHO;
    ping_packet.icmp_header.code = 0;
    ping_packet.icmp_header.checkSum = 0;
    ping_packet.icmp_header.ID = ID++;
    ping_packet.icmp_header.SeqNumber = SeqNumber++;
    ping_packet.dwTime = GetTickCount();
    ping_packet.icmp_header.checkSum = ip_checksum((USHORT*)&ping_packet, sizeof(ping_packet));
}
 
int Ping::UnPackPingPacket()
{
    return 0;
}
 
int Ping::SendPacket()
{
    PingPacket ping_packet;
    PackPingPacket(ping_packet);
    int retValue = sendto(sock,                                  // Socket
                                 (const char*)&ping_packet,    // Buffer
                                 sizeof(ping_packet),
                                 0,                                       // Flag
                                 (const sockaddr*)&dest,        // The Pointer to Socket Address 
                                 sizeof(dest));                       // Size of Socket Address
    if (retValue < 0)
    {
        cout << "Error in send Packet, error code" << GetLastError() << endl;
        return GetLastError();
    }
    return 0;
}
 
int Ping::ReceivePacket()
{
    // effetive will be worse?
    IPHeader* recv_buf = (IPHeader*)new TCHAR[MAX_DATA_SIZE];
    if (recv_buf == NULL)
    {
        return GetLastError();
    }
    int fromlen = sizeof(source);
    int retValue = recvfrom(sock,
                                    (char*)recv_buf,
                                    MAX_DATA_SIZE, 
                                    0,
                                    (sockaddr*)&source,
                                    &fromlen);
    if (retValue < 0)
    {
        cout << "Error in receive packet, error code" << GetLastError() << endl;
        return GetLastError();
    }
    else
    {
        // Decode ping packet
        DecodePingPacket(*recv_buf, retValue);
    }
    delete []recv_buf;
    recv_buf = NULL;
    return 0;
}
 
USHORT ip_checksum(USHORT* buffer, int size)
{
    unsigned long cksum = 0;
   
    // Sum all the words together, adding the final byte if size is odd
    while (size > 1) {
        cksum += *buffer++;
        size -= sizeof(USHORT);
    }
    if (size) {
        cksum += *(UCHAR*)buffer;
    }
 
    // Do a little shuffling
    cksum = (cksum >> 16) + (cksum & 0xffff);
    cksum += (cksum >> 16);
   
    // Return the bitwise complement of the resulting mishmash
    return (USHORT)(~cksum);
}
 
void ReadIPAddress(unsigned long IPAddress)
{
    printf("%d.%d.%d.%d\n", UCHAR(IPAddress),
                                       UCHAR(IPAddress >> 8),
                                       UCHAR(IPAddress >> 16),
                                       UCHAR(IPAddress >> 24));
}
 
int Ping::DecodePingPacket(const IPHeader& ip_header, const int recvPacketLen)
{
    cout << "IPHeader->source_ip:";
    ReadIPAddress(ip_header.source_ip);
    printf("IPHeader->total_len: %d\r\n", ip_header.total_len);
    printf("IPHeader->tos: %d\r\n", ip_header.tos);
    printf("IPHeader->ID:%d\r\n", ip_header.ID);
    printf("IPheader->ttl:%d\r\n", ip_header.ttl);
    USHORT ipheader_len = ip_header.h_len * 4;
 
    if (recvPacketLen < ipheader_len + ICMP_MIN)
    {
        // Packet is too small
        cout << "Receive packet is too small" << endl;
        return -1;
    }
   
    PingPacket *pingpacket = (PingPacket*)((char*)&ip_header + ipheader_len);
    if (pingpacket == NULL)
    {
        cout << "ICMP Header is NULL" << endl;
        return -1;
    }
 
    if (pingpacket->icmp_header.type == ICMP_REPLAY)
    {
        cout << "Reply Packet" << endl;
        cout << "time:" << int (GetTickCount() - pingpacket->dwTime) << endl;
    }
   
    return 0;
}
 
main.cpp
#include "PING.H"
int main()
{
    Ping myping;
    if (myping.StartClient())
    {
        cout << "Ping Machine Successfully!" << endl;
    }
    else
    {
         cout << "Ping Machine Error!" << endl;
    }
    return 0;
}
 

篮球

  岁月如梭.
  已经半年没有碰篮球了, 想想当年在软件学院也是打组织后卫的.  现在一上球场已经两腿发麻了, 多蹦几下就有抽筋的感觉.
  皑皑, 以前偶尔也能小飞一下,现在纯粹是擦着地板打球. 估计跳得就只有一块肥皂那么高.
  不过理论倒是一点没拉下, 周末必看NBA.  看看孙伟平指导那解说,真叫一专业,每次都能说到点子上: miss match, side-in-out.
  真很过瘾.
 呵呵,祝大家有个愉快的周末.
 
November 29

百度音乐怎么做的啊

  以前没觉得, 突然发现百度音乐真是做得牛B啊.
  不知道大家注意到这个细节没有, 百度音乐的歌词和音乐是同步的. 歌手每唱一句,就会显示相应的歌词.
  有谁知道大概原理,赐教.
November 27

浮躁的人啊

  卖盗版光盘的就是搞IT的,
  写点BLOG的就是文艺青年,
  ...
  用记事本连个hello,world都写不出来,还在谈什么struts, JVM.
  连个三步上篮就不会,就笑人家邓肯的罚球,妈妈的.
  摆脱,我已经是菜鸟了,你丫撑死就一菜虫.
 
  
November 20

怀念下以前的时光

小时侯其实蛮喜欢画画的, 不过现在估计连最最基本的铅笔素描也不会了.  不过小时候喜欢和隔壁邻居玩一种游戏,就是拿出一大张纸,然后每个人半小时画各种各样的太空军舰啊什么的.然后开始"石头,剪子,布", 用自己的"战舰"把对方的毁掉.类似于"太平天国"那种玩法吧,但最富激情的是"构造"自己的舰队的时候.而最伤心的时刻是自己的舰队被人家毁掉.皑皑, 真怀念童年的那段时光啊.
 
后来上了小学, 就是在动画片中度过的. "圣斗士"估计影响了一代人, 呵呵,我最喜欢一辉了.其实,现在的漫画有很难超越它的了,至少从叙事模式上来说很难突破了.
 
再后来就是初中了, 就是在"灌篮高手"和"ps足球"当中度过了. 嘿嘿,ps足球到现在我已经玩了十年了. 不知道ps3的足球是什么样子的呢?而"灌篮高手"也造就了一帮爱耍cool的小男生, 自从那部动画片播出以后, 我猛然发现很多男生背个包,留着"流川枫"式发型,一脸没表情的样子.
 
最后就是高中了, 每天都在疯打篮球,不过水平和身高没见长. 对了,从那时候开始喜欢听周杰伦的歌.
 
 
October 29

到目前为止见过的牛儿们

   一. 老牛在初学c++时候, 一晚上写出Othell.
   二. 一师哥写的汇编语言IDE,不过编译器是用别人的.
   三. 一天实现一个网络协议.(保密)
   四. 用c写设计模式.(保密)
   五. 朱朱写的英语智能输入法.
   六. 老张web中的"我的电脑"
View more entries