??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲成av人在线观看,一本综合久久,亚洲欧美久久久http://www2.blogjava.net/ioriqw/category/10524.html在中国商界、尤其是互联|界Q另一?0后”青q正在集体Q出水面,以你可能想都想不到的方式崛v?/description>zh-cnTue, 27 Feb 2007 19:32:14 GMTTue, 27 Feb 2007 19:32:14 GMT60Change Internet Proxy settingshttp://www.aygfsteel.com/ioriqw/articles/96026.html崛v的程序员崛v的程序员Thu, 25 Jan 2007 12:06:00 GMThttp://www.aygfsteel.com/ioriqw/articles/96026.htmlhttp://www.aygfsteel.com/ioriqw/comments/96026.htmlhttp://www.aygfsteel.com/ioriqw/articles/96026.html#Feedback0http://www.aygfsteel.com/ioriqw/comments/commentRss/96026.htmlhttp://www.aygfsteel.com/ioriqw/services/trackbacks/96026.html摘?/h2>

http://www.codeproject.com/internet/changeproxy1.asp

Introduction

Changing proxy settings of IE is a frequent requirement of mine. Then I got the idea of writing a tool by myself, at last. I have not found clear instructions on this. Many articles recommend to modify registry directly, but unfortunately their instruction is not enough. Most of them direct me to modify the following values in registry :-

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings]
"ProxyEnable"=dword:00000001
"ProxyServer"=":"
"ProxyOverride"=""
"DisablePasswordCaching"=dword:00000001

Details

I tested it and find that it does not work at least on my computer.( I access internet by ADSL connection.) So I backed up registry and modified proxy settings via Internet Explorer, finding that [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Connections] is also changed. So I wrote the following code snippet to change proxy settings:

Collapse
				void ShowError(long lerr)
{
    LPVOID lpMsgBuf;
    if (!FormatMessage( 
        FORMAT_MESSAGE_ALLOCATE_BUFFER | 
        FORMAT_MESSAGE_FROM_SYSTEM | 
        FORMAT_MESSAGE_IGNORE_INSERTS,
        NULL,
        lerr,
        MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
        (LPTSTR) &lpMsgBuf,
        0,
        NULL ))
    {
        return;
    }
    MessageBox( NULL, (LPCTSTR)lpMsgBuf, "Error", MB_OK | MB_ICONINFORMATION );
    LocalFree( lpMsgBuf );
}
void CieproxyDlg::OnBnClickedOk()
{//set proxy server
    UpdateData();
    GetDlgItemText(IDC_EDIT1,m_sIEProxy);
    HKEY hk;
    LONG lret=RegOpenKeyEx(HKEY_CURRENT_USER,
        "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings",
        NULL,KEY_WRITE|KEY_SET_VALUE,&hk);
    if(lret==ERROR_SUCCESS&&NULL!=hk)
    {
        TCHAR* pbuf=m_sIEProxy.GetBuffer(1);
        lret=RegSetValueEx( hk,"ProxyServer",NULL,REG_SZ,pbuf,m_sIEProxy.GetLength());
        DWORD dwenable=1;
        lret=RegSetValueEx(hk,"ProxyEnable",NULL,REG_DWORD,
           (LPBYTE)&dwenable,sizeof(dwenable));
        RegCloseKey(hk);
    }
    const TCHAR* keyname3=_T(
      "software\\Microsoft\\windows\\currentversion\\Internet Settings\\Connections");
    lret=RegOpenKeyEx(HKEY_CURRENT_USER,keyname3,NULL,
        KEY_READ|KEY_WRITE|KEY_SET_VALUE,&hk);
    if(lret==ERROR_SUCCESS&&NULL!=hk)
    {
        DWORD dwtype;
        char pbuf[256];
        DWORD dwlen=sizeof(pbuf);
        constchar* valname="Connection to adsl3";
        lret=RegQueryValueEx(hk,valname,NULL,&dwtype,pbuf,&dwlen);
        if(lret!=ERROR_SUCCESS)
        {
            ShowError(lret);
        }
        pbuf[8] = 3;//enable proxy
        pbuf[4]=pbuf[4]+1;
        constchar* p=m_sIEProxy.GetBuffer(1);
        memcpy(pbuf+16,p,m_sIEProxy.GetLength());
        char c=0;
        for(int i=m_sIEProxy.GetLength();i<20;i++)
            pbuf[16+i]=c;
        m_sIEProxy.ReleaseBuffer();
        lret=RegSetValueEx(hk,valname,NULL,REG_BINARY,pbuf,dwlen);
        RegCloseKey(hk);
    }
    DWORD dwret;
    SendMessageTimeout(HWND_BROADCAST,WM_SETTINGCHANGE,NULL,NULL,
        SMTO_NORMAL,1000,&dwret);
}

void CieproxyDlg::OnBnClickedDisableProxy()
{
    UpdateData();
    GetDlgItemText(IDC_EDIT1,m_sIEProxy);
    HKEY hk;
    LONG lret=RegOpenKeyEx(HKEY_CURRENT_USER,
        "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings",
        NULL,KEY_WRITE|KEY_SET_VALUE,&hk);
    if(lret==ERROR_SUCCESS&&NULL!=hk)
    {
        DWORD dwenable=0;
        lret=RegSetValueEx(hk,"ProxyEnable",NULL,REG_DWORD,
            (LPBYTE)&dwenable,sizeof(dwenable));
        RegCloseKey(hk);
    }
    const TCHAR* keyname3=_T(
      "software\\Microsoft\\windows\\currentversion\\Internet Settings\\Connections");
    lret=RegOpenKeyEx(HKEY_CURRENT_USER,keyname3,
        NULL,KEY_READ|KEY_WRITE|KEY_SET_VALUE,&hk);
    if(lret==ERROR_SUCCESS&&NULL!=hk)
    {
        DWORD dwtype;
        char pbuf[256];
        DWORD dwlen=sizeof(pbuf);
        constchar* valname="Connection to adsl3";
        lret=RegQueryValueEx(hk,valname,NULL,&dwtype,pbuf,&dwlen);
        if(lret!=ERROR_SUCCESS)
        {
            ShowError(lret);
        }
        pbuf[8] = 1;//enable proxy
        pbuf[4]=pbuf[4]+1;
        lret=RegSetValueEx(hk,valname,NULL,REG_BINARY,pbuf,dwlen);
        RegCloseKey(hk);
    }
    DWORD dwret;
    SendMessageTimeout(HWND_BROADCAST,WM_SETTINGCHANGE,NULL,NULL,SMTO_NORMAL,
        1000,&dwret);
}

Problem with above code is that existing Internet Explorer instances don't know the change of settings. What is more, changing registry directly is not an elegant method. Then the following must be more attractive :

Collapse
BOOL SetConnectionOptions(LPCTSTR conn_name,LPCTSTR proxy_full_addr)
{
    //conn_name: active connection name. //proxy_full_addr : eg "210.78.22.87:8000"
    INTERNET_PER_CONN_OPTION_LIST list;
    BOOL    bReturn;
    DWORD   dwBufSize = sizeof(list);
    // Fill out list struct.
    list.dwSize = sizeof(list);
    // NULL == LAN, otherwise connectoid name.
    list.pszConnection = conn_name;
    // Set three options.
    list.dwOptionCount = 3;
    list.pOptions = new INTERNET_PER_CONN_OPTION[3];
    // Make sure the memory was allocated.if(NULL == list.pOptions)
    {
        // Return FALSE if the memory wasn't allocated.
        OutputDebugString("failed to allocat memory in SetConnectionOptions()");
        return FALSE;
    }
    // Set flags.
    list.pOptions[0].dwOption = INTERNET_PER_CONN_FLAGS;
    list.pOptions[0].Value.dwValue = PROXY_TYPE_DIRECT |
        PROXY_TYPE_PROXY;

    // Set proxy name.
    list.pOptions[1].dwOption = INTERNET_PER_CONN_PROXY_SERVER;
    list.pOptions[1].Value.pszValue = proxy_full_addr;//"http://proxy:80";// Set proxy override.
    list.pOptions[2].dwOption = INTERNET_PER_CONN_PROXY_BYPASS;
    list.pOptions[2].Value.pszValue = "local";

    // Set the options on the connection.
    bReturn = InternetSetOption(NULL,
        INTERNET_OPTION_PER_CONNECTION_OPTION, &list, dwBufSize);

    // Free the allocated memory.delete [] list.pOptions;
    InternetSetOption(NULL, INTERNET_OPTION_SETTINGS_CHANGED, NULL, 0);
    InternetSetOption(NULL, INTERNET_OPTION_REFRESH , NULL, 0);
    return bReturn;
}
BOOL DisableConnectionProxy(LPCTSTR conn_name)
{
    //conn_name: active connection name. 
    INTERNET_PER_CONN_OPTION_LIST list;
    BOOL    bReturn;
    DWORD   dwBufSize = sizeof(list);
    // Fill out list struct.
    list.dwSize = sizeof(list);
    // NULL == LAN, otherwise connectoid name.
    list.pszConnection = conn_name;
    // Set three options.
    list.dwOptionCount = 1;
    list.pOptions = new INTERNET_PER_CONN_OPTION[list.dwOptionCount];
    // Make sure the memory was allocated.if(NULL == list.pOptions)
    {
        // Return FALSE if the memory wasn't allocated.
        OutputDebugString("failed to allocat memory in DisableConnectionProxy()");
        return FALSE;
    }
    // Set flags.
    list.pOptions[0].dwOption = INTERNET_PER_CONN_FLAGS;
    list.pOptions[0].Value.dwValue = PROXY_TYPE_DIRECT  ;
    // Set the options on the connection.
    bReturn = InternetSetOption(NULL,
        INTERNET_OPTION_PER_CONNECTION_OPTION, &list, dwBufSize);
    // Free the allocated memory.delete [] list.pOptions;
    InternetSetOption(NULL, INTERNET_OPTION_SETTINGS_CHANGED, NULL, 0);
    InternetSetOption(NULL, INTERNET_OPTION_REFRESH , NULL, 0);
    return bReturn;
}

The usage is very straightforward:

				//set proxy
				const
				char* connection_name="Connection to adsl3";
    SetConnectionOptions(connection_name,"62.81.236.23:80");
//disable proxy 
    DisableConnectionProxy(connection_name);
    

Existing Internet Explorer instances are notified by INTERNET_OPTION_SETTINGS_CHANGED and INTERNET_OPTION_REFRESH



]]>
Visual Assist X 破解http://www.aygfsteel.com/ioriqw/articles/85724.html崛v的程序员崛v的程序员Tue, 05 Dec 2006 16:29:00 GMThttp://www.aygfsteel.com/ioriqw/articles/85724.htmlhttp://www.aygfsteel.com/ioriqw/comments/85724.htmlhttp://www.aygfsteel.com/ioriqw/articles/85724.html#Feedback0http://www.aygfsteel.com/ioriqw/comments/commentRss/85724.htmlhttp://www.aygfsteel.com/ioriqw/services/trackbacks/85724.html 发信? xjwai (Shong), 信区: NewSoftware
标?? Visual Assist X 破解报告
发信? 水木C֌ (Wed Sep 20 21:05:46 2006), 站内

    好久没用VA? 今天有h发了新版?535, p了试, 先想用以前版本的codel果没有
成功. VA试用期一个月, 试用是全功能? q点q不? 但是到期的话׃能l了.q篇
短文的目的就是无限期扩展试用? 使你能够情享受VA带来的快?  免去大家L破解
的痛?

    本来不想发的, Visual Assist X实做得不错.如果觉得VA好用, h持正? 呵呵.

    用到的工? Registry Workshop, 附g中有一?

    以下的内容参考了一些网上的文章, 另外有一些猜的成分, 误担风?

    主要的方法就是消去VA记录下的一些安装及试用旉信息.VA记录q些信息的地Ҏ(gu)?br />?

1) HKEY_LOCAL_MACHINE\SOFTWARE\Licenses

    q一个很好找. 加入Registry Workshop收藏?

2)
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{ACABBB00-02A4-CF3E-B293-188330493F10}

    {XXX...}对于不同的版本以及不同的机器可能不同, 比如
{ACABBB00-02A4-CF3E-B293-188330493F10}是我XP虚拟Z的? 我实际机器上的是
{2401839D-8A0E-F7A3-3A39-201EB8E3078D}.

    要找到这一? p用到Registry Workshop, 览?br />HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\, 然后所有条目按旉倒序排序, ?br />Visual Assist安装旉差不多的那几?3~10个吧, 跟具体机器有? q有其他的Y件吧)
逐一? 有一个的子项不规? 而其他的都比较规? ?/p>

{ACABBB00-02A4-CF3E-B293-188330493F10}
    fMNvzvRluw
    paowhf
    Jvielmgrzqpm
    durvuNbfybvH
    Psohy
    wqGi
    zydrzwfqWyFs
    InProcServer32

而其他的一般是
{XXXXXXXX...}
    Description
    InprocServer32
    ProgID
    VersionIndependentProgID

{等, 实际上目标项{ACABBB00-02A4-CF3E-B293-188330493F10}是VA的时间信息记? 当然
只有VA的h知道它的格式? 为掩目, {ACABBB00-02A4-CF3E-B293-188330493F10} ?br />合ƈ另外的一个随机的已注册的CLSID, 因此当你看到
{ACABBB00-02A4-CF3E-B293-188330493F10} 下的 InprocServer32 好像是另外的某个感觉
很重要的东西, 我想, 如果你在 HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\ 下搜索的
? 应该搜得到它真正的条?

    扑ֈ
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{ACABBB00-02A4-CF3E-B293-188330493F10
}或者你机器上的相应后, 加入收藏?

    3) 你的temp用户变量%USERPROFILE%\Local Settings\Temp 中的临时文g
1489AFE4.TMP.
如果你的Temp用户变量讄C其他的地?比如, 我的在F:\Temp\UTemp), 请到相应的位
|找到这个文? q个文g的修Ҏ(gu)间和创徏旉都与VA安装旉相差不多. 怿不难扑ֈ
. 具体的文件名可能和版本相?
当然也可以把此目录全部清I? 一般情况下应该没有什么问?

    以上三处记录的信息应该是一L, 破解时留下Q何一处都不能成功. 卸蝲VA? q三
处的信息都保留着, 卸蝲VA然后重装的办法是行不通的. q重装pȝ, 如果你把temp用户
变量目录讑ֈ以前的位|且没有清理q? 则注册表是全新的估计也无于?

    下面l一个简单的批处理的例子, 可能需要根据自q情况和版本修改其中的一些数?/p>

    VACleanq行时请关闭Visual Studio

####################### VAClean.cmd 开?#######################

@echo off

rem 此两请自行填写为合适的?br />set cid={2401839D-8A0E-F7A3-3A39-201EB8E3078D}
set tpf="F:\Temp\UTemp\1489AFE4.TMP"

reg delete HKEY_LOCAL_MACHINE\SOFTWARE\Licenses /f
reg delete HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\%cid% /f
del /q %tpf%

echo.
pause

####################### VAClean.cmd l束 #######################

以上试Z
Visual Assist X 10.3.1535.0
Visual Assist X 10.3.1534.0 (此方法以前的版本以及以后的若q个版本可能有效)
以及
Visual C++ 6
Visual Studio 2005
以及
XP SP2

下蝲:
http://www.wholetomato.com/downloads/VA_X_Setup1301.exe
http://www.wholetomato.com/downloads/VA_X_Setup1534.exe
http://www.wholetomato.com/downloads/VA_X_Setup1535.exe

--

?来源:·水木C֌ http://newsmth.net·[FROM: 166.111.86.*]

附g: Registry_Workshop.rar (388 KB) 链接:
http://www.newsmth.net/att.php?p.99.950977.3575.rar
全文链接Q?a >http://www.newsmth.net/bbscon.php?bid=99&id=950977



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1258267



]]>
在CB中用socket api来写|络通讯E序http://www.aygfsteel.com/ioriqw/articles/44081.html崛v的程序员崛v的程序员Sat, 29 Apr 2006 12:52:00 GMThttp://www.aygfsteel.com/ioriqw/articles/44081.htmlhttp://www.aygfsteel.com/ioriqw/comments/44081.htmlhttp://www.aygfsteel.com/ioriqw/articles/44081.html#Feedback0http://www.aygfsteel.com/ioriqw/comments/commentRss/44081.htmlhttp://www.aygfsteel.com/ioriqw/services/trackbacks/44081.html本文转自csdnQ作者:kingcaiyao
原标题:在C++ Builder中用socket api来写|络通讯E序Q同时支持TCP和UDP协议Q?br />原文:  http://www.csdn.net/develop/read_article.asp?id=19883


??日看完sockcomp.pas后,我决定用socket api来写一个客L和服务器q且同时支持TCP,UDP协议Q于是我去做,现将代码贴出来(已调试通过Q?br />Socket api Client:

#ifndef UDPClientH
#define UDPClientH
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <stdio.h>
#include "CCEdit.h"
#define WM_SOCK WM_USER+100
class TLANForm : public TForm
{
__published: // IDE-managed Components
   TEdit *Port;
   TLabel *Label1;
   TLabel *Label2;
   TComboBox *Prot;
   TButton *Button1;
   TLabel *Label3;
   TEdit *Addr;
   TCCEdit *TxtEdit;
   void __fastcall FormCreate(TObject *Sender);
   void __fastcall Button1Click(TObject *Sender);
   void __fastcall FormDestroy(TObject *Sender);
private: // User declarations
   void __fastcall OnRecv(TMessage &Message);
public:  // User declarations
   __fastcall TLANForm(TComponent* Owner);
   BEGIN_MESSAGE_MAP
      VCL_MESSAGE_HANDLER(WM_SOCK,TMessage,OnRecv);
   END_MESSAGE_MAP(TForm);
};
extern PACKAGE TLANForm *LANForm;
#endif


.cpp File

#include <vcl.h>
#pragma hdrstop
#include "UDPClient.h"
#include "WinSock.h"
#pragma package(smart_init)
#pragma link "CCEdit"
#pragma resource "*.dfm"
TLANForm *LANForm;
enum PROTO {TCP=0,UDP=1};
SOCKET m_Socket=INVALID_SOCKET;
PROTO m_Protocol=TCP;
__fastcall TLANForm::TLANForm(TComponent* Owner)
   : TForm(Owner)
{

}
void __fastcall TLANForm::FormCreate(TObject *Sender)
{
   ::SendMessage(Prot->Handle,CB_SETCURSEL,0,0);
}
void __fastcall TLANForm::OnRecv(TMessage &Message)
{
   char buf[4096];
   int nLen;
   struct sockaddr_in from;
   int nLength=sizeof(struct sockaddr_in);
   switch(WSAGETSELECTEVENT(Message.LParam))
   {
      case FD_READ:
         switch(m_Protocol)
         {
            case TCP:
               nLen=recv(m_Socket,buf,4096,0);
               if(nLen>0){
                  buf[nLen]='\0';
                  TxtEdit->Text="Received Length:"+String(nLen)+"\r\n"+StrPas(buf);
               }
               break;
            case UDP:
               nLen=recvfrom(m_Socket,buf,4096,0,(struct sockaddr*)&from,&nLength);
               if(nLen>0){
                  buf[nLen]='\0';
                  TxtEdit->Text="Received Length:"+String(nLen)+"\r\n"+StrPas(buf);
               }
               break;
         }
         break;
      case FD_CLOSE:
         closesocket(m_Socket);
         break;
   }
}

void __fastcall TLANForm::Button1Click(TObject *Sender)
{
   char szTmp[256],buf[4096];
   int nSize=0;
   UINT m_Port;
   AnsiString addr;
   addr=Addr->Text.Trim();
   if(addr.IsEmpty()){
      ::MessageBox(0,"Please enter the server IP!","Error",MB_OK+MB_ICONERROR);
      return;
   }
   unsigned long nAddr=inet_addr(addr.c_str());
   if(nAddr==INADDR_NONE){
      ::MessageBox(0,"Bad Internet IP!","Error",MB_OK+MB_ICONERROR);
      return;}

   try
   {
      m_Port=Port->Text.ToInt();
   }
   catch(Exception &e)
   {
      ::MessageBox(0,e.Message.c_str(),"Error",MB_OK+MB_ICONERROR);
      return;
   }
   switch(Prot->ItemIndex)
   {
      case 0:
         m_Protocol=TCP;
         break;
      case 1:
         m_Protocol=UDP;
         break;
   }
   if(TxtEdit->Text.IsEmpty()){
      ::MessageBox(0,"Please enter the text you want to send!","Error",MB_OK+MB_ICONERROR);
      return;}

   //Initialize Winsocket
   WSAData wsaData;
   ::ZeroMemory(&wsaData,sizeof(WSAData));
   WORD version=MAKEWORD(2,0);
   if(::WSAStartup(version,&wsaData)){
      sprintf(szTmp,"Failed to initial winsock enviroment!,error no:%d",::WSAGetLastError());
      return;}

   //Obtain the active connection
   char ComputerName[255];
   gethostname(ComputerName,255);
   struct hostent* he=gethostbyname(ComputerName);
   if(!he){
      sprintf(szTmp,"Failed to get information to host!","Error",MB_OK+MB_ICONERROR);
      ::WSACleanup();
      return;
   }
   //create new socket
   m_Socket=INVALID_SOCKET;
   switch(m_Protocol)
   {
      case TCP:
         m_Socket=socket(AF_INET,SOCK_STREAM,0);
         break;
      case UDP:
         m_Socket=socket(AF_INET,SOCK_DGRAM,0);
         break;
   }
   if(m_Socket==INVALID_SOCKET){
      sprintf(szTmp,"Failed to create a new socket!,error no:%d",::WSAGetLastError());
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
      ::WSACleanup();
      return;
   }
   //bind socket
   struct sockaddr_in client;
   unsigned long nClient;
   memcpy(&nClient,he->h_addr_list[0],sizeof(int));
   if(nClient==INADDR_NONE){
      sprintf(szTmp,"Failed to obtain the local machine's IP!","Error",MB_OK+MB_ICONERROR);
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
      closesocket(m_Socket);
      ::WSACleanup();
      return;
   }
   client.sin_family=AF_INET;
   client.sin_port=0;
   client.sin_addr.S_un.S_addr=(int)nClient;
   if(bind(m_Socket,(struct sockaddr*)&client,sizeof(struct sockaddr))){
      sprintf(szTmp,"Failed to bind socket!","Error",MB_OK+MB_ICONERROR);
      closesocket(m_Socket);
      ::WSACleanup();
      return;}
   //connect socket
   struct sockaddr_in To;
   To.sin_family=AF_INET;
   To.sin_port=htons(m_Port);
   To.sin_addr.S_un.S_addr=(int)nAddr;
   fd_set FDSET;
   FD_ZERO(&FDSET);
   FD_SET(m_Socket,&FDSET);


   if(m_Protocol==TCP){
      if(connect(m_Socket,(struct sockaddr*)&To,sizeof(struct sockaddr))){
         sprintf(szTmp,"Failed to connect the object!,error no:%d",::WSAGetLastError());
         ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
         closesocket(m_Socket);
         ::WSACleanup();
         return;
      }
      int nError=select(1,0,&FDSET,0,0);
      if(nError<=0){
      sprintf(szTmp,"Failed to select socket!,error no:%d",::WSAGetLastError());
      closesocket(m_Socket);
      ::WSACleanup();
      return;}
   }
   //Send data
   int nLen=TxtEdit->Text.Length();
   if(nLen>4096){
      sprintf(szTmp,"The buffer is too size to send,it shoud not be more than 4096 bytes!");
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
      closesocket(m_Socket);
      ::WSACleanup();
      return;
   }
   strncpy(buf,TxtEdit->Text.c_str(),nLen);
   switch(m_Protocol)
   {
      case TCP:
         nSize=send(m_Socket,buf,nLen,0);
         //ShowMessage(nSize);
         break;
      case UDP:
         nSize=sendto(m_Socket,buf,nLen,0,(struct sockaddr*)&To,sizeof(struct sockaddr));
         //ShowMessage(nSize);
         break;

   }
   if(::WSAAsyncSelect(m_Socket,Handle,WM_SOCK,FD_READ|FD_CLOSE)){
      sprintf(szTmp,"Failed to register socket event!,error no:%d",::WSAGetLastError());
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
      closesocket(m_Socket);
      ::WSACleanup();
      return;}
}
void __fastcall TLANForm::FormDestroy(TObject *Sender)
{
   closesocket(m_Socket);
   ::WSACleanup();
}

Socket api Server:
.h File
#ifndef UDPServerH
#define UDPServerH
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <stdio.h>
#include "WinSock.h"
/*#define WM_SOCKET WM_USER+1000
#define INITSOCKETSUCCESS 0
#define INITSOCKETFAILURE 1
#define CREATELISTENSOCKETSUCCESS 2
#define CREATELISTENSOCKETFAILURE 3
#define SETLISTENSOCKETSUCCESS 4
#define SETLISTENSOCKETFAILURE 5
#define BINDLISTENSOCKETSUCCESS 6
#define BINDLISTENSOCKETFAILURE 7
#define LISTENSOCKETSUCCESS 8
#define LISTENSOCKETFAILURE 9
#define ACCEPTSOCKETSUCCESS 10
#define ACCEPTSOCKETFAILURE 11
*/
class TPSTNForm : public TForm
{
__published: // IDE-managed Components
   TEdit *Port;
   TLabel *Label1;
   TMemo *Memo1;
   TButton *Button1;
   TButton *Button2;
   TLabel *Label2;
   TComboBox *Prot;
   void __fastcall Button1Click(TObject *Sender);
   void __fastcall Button2Click(TObject *Sender);
   void __fastcall FormCreate(TObject *Sender);
   void __fastcall FormDestroy(TObject *Sender);
private: // User declarations
public:  // User declarations
   __fastcall TPSTNForm(TComponent* Owner);
};
enum PROTO {TCP,UDP};
class TCommunication:public TThread    //Communication Thread
{
private:
   SOCKET m_AcceptSocket;
   char szTmp[256];//ERROR MESSAGE
public:
   __fastcall TCommunication(SOCKET m_Socket,bool CreateSuspended);
   __fastcall ~TCommunication();
protected:
   virtual void __fastcall Execute();
};
class TListenThread:public TThread //Listen Thread
{
private:
   WSAData wsaData;
   struct sockaddr_in server;
   fd_set FDS;
   UINT m_Port;
   PROTO m_Protocol;
   char szTmp[256];//Error Message
public:
   SOCKET m_Socket;
   void __fastcall DoError();
   void __fastcall InitSocket();
   void __fastcall CreateListenSocket();
   void __fastcall SetListenSocket();
   void __fastcall BindListenSocket();
   void __fastcall ListenSocket();

public:
   __fastcall TListenThread(PROTO m_ProtocolA,UINT m_PortA,bool CreateSuspended);
   virtual __fastcall ~TListenThread();
protected:
   virtual void __fastcall Execute();
};
extern PACKAGE TPSTNForm *PSTNForm;
#endif
.cpp File
#include <vcl.h>
#pragma hdrstop
#include "UDPServer.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TPSTNForm *PSTNForm;
TListenThread *pThread=0;
//******************************CLASS TCommunication For TCP****************************************************
__fastcall TCommunication::TCommunication(SOCKET m_Socket,bool CreateSuspended):TThread(FALSE)
{
   m_AcceptSocket=m_Socket;
   szTmp[0]='\0';
   FreeOnTerminate=true;
}
__fastcall TCommunication::~TCommunication()
{
  // closesocket(m_AcceptSocket);
}
void __fastcall TCommunication::Execute()
{
   char buf[4096];
   int nSize=0;
   nSize=recv(m_AcceptSocket,(char FAR*)buf,4096,0);
   if(nSize>0)
   {
      buf[nSize]='\0';
      //Display
      PSTNForm->Memo1->Lines->Add("Received Length:"+String(nSize));
      PSTNForm->Memo1->Lines->Add("Received:"+StrPas(buf));
      //Deliver
      ::Sleep(100);
      send(m_AcceptSocket,buf,nSize,0);
   }

}
//******************************CLASS TListenThread*****************************************************
__fastcall TListenThread::TListenThread(PROTO m_ProtocolA,UINT m_PortA,bool CreateSuspended):TThread(FALSE)
{
   m_Socket=INVALID_SOCKET;
   m_Port=m_PortA;
   m_Protocol=m_ProtocolA;
   szTmp[0]='\0';
   ::ZeroMemory(&wsaData,sizeof(WSAData));
   ::ZeroMemory(&server,sizeof(struct sockaddr_in));
   FreeOnTerminate=TRUE;//Automatically delete while terminating.
}
__fastcall TListenThread::~TListenThread()
{
   closesocket(m_Socket);
   ::WSACleanup();
   m_Socket=INVALID_SOCKET;
   m_Port=0;
   m_Protocol=TCP;
   szTmp[0]='\0';
   ::ZeroMemory(&wsaData,sizeof(WSAData));
   ::ZeroMemory(&server,sizeof(struct sockaddr_in));
}
void __fastcall TListenThread::DoError()
{
   if(m_Socket!=INVALID_SOCKET) closesocket(m_Socket);
   WSACleanup();
   return;
}
void __fastcall TListenThread::InitSocket()
{
   WORD version=MAKEWORD(2,0);
   if(::WSAStartup(version,&wsaData)){
      sprintf(szTmp,"Failed to intiailize socket,error no:%d",::WSAGetLastError());
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
      DoError();
      return;
   }
}
void __fastcall TListenThread::CreateListenSocket()
{
   switch(m_Protocol)
   {
      case UDP:
         m_Socket=socket(AF_INET,SOCK_DGRAM,0);
         break;
      case TCP:
         m_Socket=socket(AF_INET,SOCK_STREAM,0);
         break;
      default:
         sprintf(szTmp,"Error protocol!");
         ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
         DoError();
         break;
   }
   if(m_Socket==INVALID_SOCKET){
      sprintf(szTmp,"Failed to create socket!");
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
      DoError();
      return;
   }
}
void __fastcall TListenThread::SetListenSocket()
{
   server.sin_family=AF_INET;
   server.sin_port=htons(m_Port);
   server.sin_addr.S_un.S_addr=INADDR_ANY;
   int NewOpenType=SO_SYNCHRONOUS_NONALERT;
   if(setsockopt(INVALID_SOCKET,SOL_SOCKET,SO_OPENTYPE,(char*)&NewOpenType,4)){
      sprintf(szTmp,"Set socket option error,error no:%d",::WSAGetLastError());
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
      DoError();
      return;
   }
}
void __fastcall TListenThread::BindListenSocket()
{
    if(bind(m_Socket,(sockaddr*)&server,sizeof(struct sockaddr_in))){
      sprintf(szTmp,"Failed to bind socket,error no:%d",::WSAGetLastError());
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
      DoError();
      return;
   }

}
void __fastcall TListenThread::ListenSocket()
{
  if(listen(m_Socket,SOMAXCONN)){
     sprintf(szTmp,"listen error,error no:%d",::WSAGetLastError());
     ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
     DoError();
     return;
  }
  //Determine whether there is any connection
  FD_ZERO(&FDS);
  FD_SET(m_Socket,&FDS);
}
void __fastcall TListenThread::Execute()
{
   char buf[4096];
   struct sockaddr_in from; //for UDP
   int nLen=sizeof(from),nSize=0;  //for UDP
   InitSocket();
   CreateListenSocket();
   SetListenSocket();
   BindListenSocket();
   if(m_Protocol==UDP){
      while(!Terminated){
         int nSize=recvfrom(m_Socket,buf,4096,0,(struct sockaddr*)&from,&nLen);
         if(nSize>0){
            buf[nSize]='\0';
            PSTNForm->Memo1->Lines->Add("Received Length:"+String(nSize));
            PSTNForm->Memo1->Lines->Add("Received:"+StrPas(buf));
            ::Sleep(100);
            sendto(m_Socket,buf,nSize,0,(struct sockaddr*)&from,sizeof(struct sockaddr_in));
         }
         else return;

      }
   }
   ListenSocket();
   struct sockaddr_in client;
   int nLength=sizeof(struct sockaddr_in);
   while(!Terminated){
      int nError=select(1,&FDS,0,0,0);
      if(nError<=0) Terminate();
      SOCKET m_AcceptSocket=accept(m_Socket,(struct sockaddr*)&client,&nLength);
      if(m_AcceptSocket==INVALID_SOCKET){
         sprintf(szTmp,"Failed to execute accept,error no:%d",::WSAGetLastError());
         ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
         DoError();
         Terminate();
         return;
      }
      TCommunication *pCThread=new TCommunication(m_AcceptSocket,FALSE);
      pCThread->Terminate();
      pCThread->WaitFor();
   }
}
//************************PSTNForm*********************************************//
__fastcall TPSTNForm::TPSTNForm(TComponent* Owner)
   : TForm(Owner)
{
}
void __fastcall TPSTNForm::Button1Click(TObject *Sender)
{
   Close();
}
void __fastcall TPSTNForm::Button2Click(TObject *Sender)
{
   if(pThread){
      pThread->Suspend();
      pThread->Terminate();
      delete pThread;
      pThread=0;
   }
   UINT m_Port;
   try
   {
      m_Port=Port->Text.ToInt();
   }
   catch(Exception &e)
   {
      ::MessageBox(0,e.Message.c_str(),"Error",MB_OK+MB_ICONERROR);
      return;
   }
   PROTO m_Protocol;
   switch(Prot->ItemIndex)
   {
      case 0:
         m_Protocol=TCP;
         break;
      case 1:
         m_Protocol=UDP;
         break;
      default:
         break;
   }
   pThread=new TListenThread(m_Protocol,m_Port,FALSE);
   //pThread->Terminate();
}
void __fastcall TPSTNForm::FormCreate(TObject *Sender)
{
   ::SendMessage(Prot->Handle,CB_SETCURSEL,0,1);
}

void __fastcall TPSTNForm::FormDestroy(TObject *Sender)
{
   if(pThread){
      pThread->Suspend();
      pThread->Terminate();}
}
上面的代码,各位可根据自已的需要和针对自已的应用,在数据处理方面加以改q就可以?/font>

]]>
关于目录处理的一些函?/title><link>http://www.aygfsteel.com/ioriqw/articles/44078.html</link><dc:creator>崛v的程序员</dc:creator><author>崛v的程序员</author><pubDate>Sat, 29 Apr 2006 12:46:00 GMT</pubDate><guid>http://www.aygfsteel.com/ioriqw/articles/44078.html</guid><wfw:comment>http://www.aygfsteel.com/ioriqw/comments/44078.html</wfw:comment><comments>http://www.aygfsteel.com/ioriqw/articles/44078.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/ioriqw/comments/commentRss/44078.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/ioriqw/services/trackbacks/44078.html</trackback:ping><description><![CDATA[ <font face="Arial" color="#808080" size="2">在编E时,l常有一些针对目录的操作,如打开目录对话框选择一个目?直接创徏多目录,直接删除多目录,判断某个目录是否存在{。本文就q些问题l出~程实现Ҏ(gu)Qƈl出详细的程序代码,供各位编E爱好者参考?br /><br />一、判断目录是否存在:<br /><br />  C++ Builder中提供了查文件是否存在的函数FileExistsQ但没有提供查目录是否存在的函数Q我们可以用Windows API函数FindFirstFile实现q个功能。程序实现如下:<br /><br />设char *Dir为带判断的目?br />bool Exist;                                            // 最后结果,表示目录是否存在<br />if(Dir[strlen(Dir)]=='\\')Dir[strlen(Dir)-1]='\0';    // 先删除最后的“\?br />WIN32_FIND_DATA wfd;                                  // 查找<br />HANDLE hFind=FindFirstFile(Dir,&wfd);                  <br />if(hFind==INVALID_HANDLE_VALUE)Exist=false;            // 没有扑ֈ配备Q目录肯定不存在<br />else<br />{<br />    if(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) // 查找到的l果是否目录<br />        Exist=true;                                      // 是目?目录存在<br />    else<br />        Exist=false;                                    // 是目?目录不存?br />    FindClose(hFind);<br />} <br /><br />二、打开目录选择对话框选择一个目录:<br /><br />  大多专业软g在要求输入目录的~辑框旁都放了一个按钮,点击后打开一个目录窗口,很多~程爱好者也希望能掌握这个方法。实现这个功能要调用Windows API函数SHBrowseForFolderQ完整声明ؓWINSHELLAPI LPITEMIDLIST WINAPI SHBrowseForFolder(LPBROWSEINFO lpbi)Q返回一个ITEMIDLISTcd的指针,通过q个指针调用函数SHGetPathFromIDList可以定所选择的目录的全名U。入参ؓBROWSEINFOl构的指针,q个l构较ؓ复杂Q成员如下所C:<br /><br />HWND hwndOwner;        // 拥有对话框的H口Q可以设|ؓApplication->Handle <br />LPCITEMIDLIST pidlRoot; // ITEMIDLISTcd的指?表示在哪个\径下选择Q一般可以设|ؓNULL<br />LPSTR pszDisplayName;  // 选择后,所选目录的名称(不包含父U目?被拷贝到q个指针指向的位|?<br />LPCSTR lpszTitle;      // 作ؓ标题昄在对话框中目录树的上面,可以Ҏ(gu)实际情况讄 <br />UINT ulFlags;          // 标志位,有点复杂Q一般设|ؓBIF_RETURNONLYFSDIRS <br />BFFCALLBACK lpfn;      // 回调函数Q一般不用,讄为NULL <br />LPARAM lParam;          // 预定义的对话框传递给回调函数的?br />int iImage;            // 与所选目录相兌的图标在pȝ图标集合中的索引 <br />可以看出Q用函数SHBrowseForFolderq真ȝQ普通爱好者掌握它实有一定的隑ֺQ现l出完整E序D如下: <br />#include <shlobj.h>                    // 必须包含的头文g<br />char SelectedDir[MAX_PATH];              // 最l结?br />BROWSEINFO bi;                          // 入参<br />char FolderName[MAX_PATH];              // 所选目录名Uͼ例如选择C:\Windows\Font,则ؓFont <br />LPITEMIDLIST ItemID;                    // 所选目录的pȝ标志指针<br /><br />memset(SelectedDir, 0, MAX_PATH);              // 初始化最l结?br />memset(&bi, 0, sizeof(BROWSEINFO));    // 初始化入参所有数?br />bi.hwndOwner = Application->Handle;<br />bi.pszDisplayName = FolderName;<br />bi.lpszTitle = "请选择目录";            // Ҏ(gu)自己希望?br />bi.ulFlags=BIF_RETURNONLYFSDIRS;<br />ItemID = SHBrowseForFolder(&bi);      // 调用函数Q打开目录选择对话?br />if(ItemID)<br />{<br />    SHGetPathFromIDList(ItemID, SelectedDir);      // 获取所选目录的全名<br />    GlobalFree(ItemID);                      // q回的ItemID占用了系l资源,不要忘了释放<br />} <br /><br />三、直接徏立多U目录:<br /><br />  Windows API提供了徏立目录的函数CreateDirectoryQ但是调用前要保证父目录必须存在Q否则会p|。其实,有时建立多目录很有用,因ؓ在徏立目录特别是建立多层目录Ӟ层层加以判断会大大地增加E序的复杂程度。如何实现这个功能呢Q本人用递归Ҏ(gu)设计了一个可以直接徏立多U目录的函数Q现说明如下Q供各位朋友参考?br /><br />bool MakeDirectoryEx(const AnsiString &P)  // 入参为打创建的目录?Ҏ(gu)操作l果q回"true"?false"<br />{<br />    if(P.IsEmpty())return false;<br />    int len=P.Length();<br />    char *Path=P.c_str();<br />    if(Path[len-1]=='\\')<br />    {<br />        len--;<br />        Path[len]='\0';<br />    }                                      // 删除末尾?\"<br />    AnsiString Dir=Path;<br />    // 分开父目录和本n目录名称<br />    AnsiString Parent;<br />    for(int i=len-1;i>0;i--)<br />    {<br />        if(Dir.IsPathDelimiter(i))<br />        {<br />            Parent=Dir.SubString(0,i);<br />            break;<br />        }<br />    }<br />    if(Parent.IsEmpty())return false; // 目录名称错误<br />    bool Ret=true;<br />    if(Parent.Length()>3)          // 如果长度于3Q表CZؓ盘根目?br />        Ret=DirectoryExistEx(Parent.c_str());// 查父目录是否存在<br />    if(!Ret)Ret=MakeDirectoryEx(Parent);  // 父目录不存在,递归调用创徏父目?br />    if(Ret)                                        // 父目录存?直接创徏目录<br />    {<br />        SECURITY_ATTRIBUTES sa;<br />        sa.nLength=sizeof(SECURITY_ATTRIBUTES);<br />        sa.lpSecurityDescriptor=NULL;<br />        sa.bInheritHandle=0;<br />        Ret=CreateDirectory(Path,&sa);<br />    }<br />    return Ret;<br />} <br />    可以看出基本Ҏ(gu)?<br />先检查父目录是否存在Q这里用到的函数DirectoryExistEx可以按照前面介绍的方法设计; <br />如果父目录存在,则直接创建目?否则自我调用创徏父目录?<br /><br /><br />四、直接删除整个目录:<br /><br />  在DOS下有一个Deltree命oQ用来删除整个目录,q是一个很有用的功能,可惜QWindows API提供的函数RemoveDirectory只能删除控目录,像DOS的RD命o一栗编E实现这个功能同样需要递归Ҏ(gu)Q基本流E是Q?<br /><br />查找目录下的所有文件和目录Q即调用API函数FindFirstFile、FindNextFile(*.*) <br />如果扑ֈ文gQ则强制删除。所谓强制删除,卛_除前先调用SetFileAttributes把它的属性设|ؓNormalQ然后调用DeleteFile删除它?<br />如果扑ֈ目录Q则q行自我调用Q即开始递归q程?<br />如果没有扑ֈ目录Q即表示为控目录Q调用RemoveDirectory直接删除?<br />具体E序代码如下Q?br /><br />bool DeleteDirectoryEx(const AnsiString &P)<br />{<br />    if(P.IsEmpty() || P.Length()<4)return false;        // 参数长度必须大于3Q即不能为磁盘根目录或空?br />    int len=P.Length();<br />    char *Path=P.c_str();<br />    AnsiString Dir=Path;<br />    if(Path[len-1]!='\\')Dir=Dir+'\\';<br />    AnsiString Files=Dir+"*.*";<br />    WIN32_FIND_DATA wfd;<br />    HANDLE hFind=FindFirstFile(Files.c_str(),&wfd);<br />    bool Ret=true;<br />    AnsiString Tmp;<br />    if(hFind!=INVALID_HANDLE_VALUE)<br />    {<br />        bool bFind=true;<br />        while(bFind)<br />        {<br />            if(wfd.cFileName[0]!='.') // . ..<br />            {<br />                Tmp=Dir+wfd.cFileName;<br />                if(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)<br />                { // 删除所有子目录<br />                    Ret=Ret&&DeleteDirectoryEx(Tmp.c_str(),false);<br />                }else<br />                { // 删除所有文?br />                    SetFileAttributes(Tmp.c_str(),FILE_ATTRIBUTE_NORMAL);<br />                    Ret=Ret&&DeleteFile(Tmp.c_str());<br />                }<br />            }<br />            bFind=FindNextFile(hFind,&wfd);<br />        }<br />        FindClose(hFind);<br />    }<br />    if(Ret)return RemoveDirectory(Path);<br />    return false;<br />}</font> <img src ="http://www.aygfsteel.com/ioriqw/aggbug/44078.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/ioriqw/" target="_blank">崛v的程序员</a> 2006-04-29 20:46 <a href="http://www.aygfsteel.com/ioriqw/articles/44078.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>微YpingE序源代码完整版http://www.aygfsteel.com/ioriqw/articles/43476.html崛v的程序员崛v的程序员Thu, 27 Apr 2006 01:44:00 GMThttp://www.aygfsteel.com/ioriqw/articles/43476.htmlhttp://www.aygfsteel.com/ioriqw/comments/43476.htmlhttp://www.aygfsteel.com/ioriqw/articles/43476.html#Feedback0http://www.aygfsteel.com/ioriqw/comments/commentRss/43476.htmlhttp://www.aygfsteel.com/ioriqw/services/trackbacks/43476.html 作?侯志?/font>

~写自己的一个pingE序,可以说是许多出网l编E的W一步吧!!q个pingE序的源代码l过我的修改和调?基本上可以取代windows中自带的pingE序. 各个模块后都有我的详l注释和修改日志,希望能够对大家的学习有所帮助!!

/*  本程序的主要源代码来自MSDN|站, W者只是做了一些改q和注释! 另外需要注意的是在Build之前,必须加入ws2_32.lib库文?否则会提C?error LNK2001:"的错误!*/

/******************************************************************************\
| Version 1.1 修改记录:                                                                                                              |
|    <1> 解决了socketd的问?从而能够正地处理时的请?                                                        |
|----------------------------------------------------------------------------------------------------|
| Version 1.2 修改记录:                                                                                                              |
|    <1> 增加了由用户控制发送ICMP包的数目的功?卛_令的W二个参?.                                              |   
|    <2> 增加了对pingl果的统计功?                                                                                           |
\******************************************************************************/

#pragma pack(4)

#include
#include
#include

#define ICMP_ECHO 8
#define ICMP_ECHOREPLY 0

#define ICMP_MIN 8 // minimum 8 byte icmp packet (just header)

/* The IP header */
typedef struct iphdr {
unsigned int h_len:4; // length of the header
unsigned int version:4; // Version of IP
unsigned char tos; // Type of service
unsigned short total_len; // total length of the packet
unsigned short ident; // unique identifier
unsigned short frag_and_flags; // flags
unsigned char ttl;
unsigned char proto; // protocol (TCP, UDP etc)
unsigned short checksum; // IP checksum

unsigned int sourceIP;
unsigned int destIP;

}IpHeader;

//
// ICMP header
//
typedef struct icmphdr {
BYTE i_type;
BYTE i_code; /* type sub code */
USHORT i_cksum;
USHORT i_id;
USHORT i_seq;
/* This is not the std header, but we reserve space for time */
ULONG timestamp;
}IcmpHeader;

#define STATUS_FAILED 0xFFFF
#define DEF_PACKET_SIZE    32
#define DEF_PACKET_NUMBER  4    /* 发送数据报的个?*/
#define MAX_PACKET 1024

#define xmalloc(s) HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,(s))
#define xfree(p) HeapFree (GetProcessHeap(),0,(p))

void fill_icmp_data(char *, int);
USHORT checksum(USHORT *, int);
int decode_resp(char *,int ,struct sockaddr_in *);

void Usage(char *progname){

fprintf(stderr,"Usage:\n");
fprintf(stderr,"%s [number of packets] [data_size]\n",progname);
fprintf(stderr,"datasize can be up to 1Kb\n");
ExitProcess(STATUS_FAILED);

}
int main(int argc, char **argv){

WSADATA wsaData;
SOCKET sockRaw;
struct sockaddr_in dest,from;
struct hostent * hp;
int bread,datasize,times;
int fromlen = sizeof(from);
int timeout = 1000;
int statistic = 0;  /* 用于l计l果 */ 
char *dest_ip;
char *icmp_data;
char *recvbuf;
unsigned int addr=0;
USHORT seq_no = 0;

if (WSAStartup(MAKEWORD(2,1),&wsaData) != 0){
fprintf(stderr,"WSAStartup failed: %d\n",GetLastError());
ExitProcess(STATUS_FAILED);
}

if (argc <2 ) {
Usage(argv[0]);
}
sockRaw = WSASocket(AF_INET,SOCK_RAW,IPPROTO_ICMP,NULL, 0,WSA_FLAG_OVERLAPPED);

//
//注:Z使用发送接收超时设|?卌|SO_RCVTIMEO, SO_SNDTIMEO)Q?
//    必须标志位设ؓWSA_FLAG_OVERLAPPED !
//

if (sockRaw == INVALID_SOCKET) {
fprintf(stderr,"WSASocket() failed: %d\n",WSAGetLastError());
ExitProcess(STATUS_FAILED);
}
bread = setsockopt(sockRaw,SOL_SOCKET,SO_RCVTIMEO,(char*)&timeout,
sizeof(timeout));
if(bread == SOCKET_ERROR) {
fprintf(stderr,"failed to set recv timeout: %d\n",WSAGetLastError());
ExitProcess(STATUS_FAILED);
}
timeout = 1000;
bread = setsockopt(sockRaw,SOL_SOCKET,SO_SNDTIMEO,(char*)&timeout,
sizeof(timeout));
if(bread == SOCKET_ERROR) {
fprintf(stderr,"failed to set send timeout: %d\n",WSAGetLastError());
ExitProcess(STATUS_FAILED);
}
memset(&dest,0,sizeof(dest));

hp = gethostbyname(argv[1]);

if (!hp){
addr = inet_addr(argv[1]);
}
if ((!hp) && (addr == INADDR_NONE) ) {
fprintf(stderr,"Unable to resolve %s\n",argv[1]);
ExitProcess(STATUS_FAILED);
}

if (hp != NULL)
memcpy(&(dest.sin_addr),hp->h_addr,hp->h_length);
else
dest.sin_addr.s_addr = addr;

if (hp)
dest.sin_family = hp->h_addrtype;
else
dest.sin_family = AF_INET;

dest_ip = inet_ntoa(dest.sin_addr);

//
//  atoi函数原型? int atoi( const char *string );
//  The return value is 0 if the input cannot be converted to an integer !
//
if(argc>2)
{
 times=atoi(argv[2]);
 if(times == 0)
  times=DEF_PACKET_NUMBER;
}
else
    times=DEF_PACKET_NUMBER;

if (argc >3)
{
 datasize = atoi(argv[3]);
    if (datasize == 0)
        datasize = DEF_PACKET_SIZE;
 if (datasize >1024)   /* 用户l出的数据包大小太大 */
 {
  fprintf(stderr,"WARNING : data_size is too large !\n");
  datasize = DEF_PACKET_SIZE;
 }
}
else
    datasize = DEF_PACKET_SIZE;

datasize += sizeof(IcmpHeader);

icmp_data = (char*)xmalloc(MAX_PACKET);
recvbuf = (char*)xmalloc(MAX_PACKET);

if (!icmp_data) {
fprintf(stderr,"HeapAlloc failed %d\n",GetLastError());
ExitProcess(STATUS_FAILED);
}


memset(icmp_data,0,MAX_PACKET);
fill_icmp_data(icmp_data,datasize);

//
//昄提示信息
//
fprintf(stdout,"\nPinging %s ....\n\n",dest_ip);


for(int i=0;i{
int bwrote;

((IcmpHeader*)icmp_data)->i_cksum = 0;
((IcmpHeader*)icmp_data)->timestamp = GetTickCount();

((IcmpHeader*)icmp_data)->i_seq = seq_no++;
((IcmpHeader*)icmp_data)->i_cksum = checksum((USHORT*)icmp_data,datasize);

bwrote = sendto(sockRaw,icmp_data,datasize,0,(struct sockaddr*)&dest,sizeof(dest));
if (bwrote == SOCKET_ERROR){
if (WSAGetLastError() == WSAETIMEDOUT) {
printf("Request timed out.\n");
continue;
}
fprintf(stderr,"sendto failed: %d\n",WSAGetLastError());
ExitProcess(STATUS_FAILED);
}
if (bwrote < datasize ) {
fprintf(stdout,"Wrote %d bytes\n",bwrote);
}
bread = recvfrom(sockRaw,recvbuf,MAX_PACKET,0,(struct sockaddr*)&from,&fromlen);
if (bread == SOCKET_ERROR){
if (WSAGetLastError() == WSAETIMEDOUT) {
printf("Request timed out.\n");
continue;
}
fprintf(stderr,"recvfrom failed: %d\n",WSAGetLastError());
ExitProcess(STATUS_FAILED);
}
if(!decode_resp(recvbuf,bread,&from))
 statistic++; /* 成功接收的数?+ */
Sleep(1000);

}
 
/*
Display the statistic result
*/
fprintf(stdout,"\nPing statistics for %s \n",dest_ip);
fprintf(stdout,"    Packets: Sent = %d,Received = %d, Lost = %d (%2.0f%% loss)\n",times,
     statistic,(times-statistic),(float)(times-statistic)/times*100);


WSACleanup();
return 0;

}
/*
The response is an IP packet. We must decode the IP header to locate
the ICMP data
*/
int decode_resp(char *buf, int bytes,struct sockaddr_in *from) {

IpHeader *iphdr;
IcmpHeader *icmphdr;
unsigned short iphdrlen;

iphdr = (IpHeader *)buf;

iphdrlen = (iphdr->h_len) * 4 ; // number of 32-bit words *4 = bytes

if (bytes < iphdrlen + ICMP_MIN) {
printf("Too few bytes from %s\n",inet_ntoa(from->sin_addr));
}

icmphdr = (IcmpHeader*)(buf + iphdrlen);

if (icmphdr->i_type != ICMP_ECHOREPLY) {
fprintf(stderr,"non-echo type %d recvd\n",icmphdr->i_type);
return 1;
}
if (icmphdr->i_id != (USHORT)GetCurrentProcessId()) {
fprintf(stderr,"someone else's packet!\n");
return 1;
}
printf("%d bytes from %s:",bytes, inet_ntoa(from->sin_addr));
printf(" icmp_seq = %d. ",icmphdr->i_seq);
printf(" time: %d ms ",GetTickCount()-icmphdr->timestamp);
printf("\n");
return 0;

}


USHORT checksum(USHORT *buffer, int size) {

unsigned long cksum=0;

while(size >1) {
cksum+=*buffer++;
size -=sizeof(USHORT);
}

if(size) {
cksum += *(UCHAR*)buffer;
}

cksum = (cksum >> 16) + (cksum & 0xffff);
cksum += (cksum >>16);
return (USHORT)(~cksum);
}
/*
Helper function to fill in various stuff in our ICMP request.
*/
void fill_icmp_data(char * icmp_data, int datasize){

IcmpHeader *icmp_hdr;
char *datapart;

icmp_hdr = (IcmpHeader*)icmp_data;

icmp_hdr->i_type = ICMP_ECHO;
icmp_hdr->i_code = 0;
icmp_hdr->i_id = (USHORT)GetCurrentProcessId();
icmp_hdr->i_cksum = 0;
icmp_hdr->i_seq = 0;

datapart = icmp_data + sizeof(IcmpHeader);
//
// Place some junk in the buffer.
//
memset(datapart,'E', datasize - sizeof(IcmpHeader));

}

/******************* ? ping命o执行时显C的画面 ***************\
*  C:\Documents and Settings\houzhijiang>ping 236.56.54.12               *
*                                                                                                      *
*  Pinging 236.56.54.12 with 32 bytes of data:                                      *
*                                                                                                      *
*  Request timed out.                                                                         *
*  Request timed out.                                                                         *
*  Request timed out.                                                                         *
*  Request timed out.                                                                         *
*                                                                                                      *
*  Ping statistics for 236.56.54.12:                                                      *
*     Packets: Sent = 4, Received = 0, Lost = 4 (100% loss),                  *
*                                                                                                      *
\*********************************************************/

/*********************************************************\
*  C:\Documents and Settings\houzhijiang>ping 127.0.0.1                    *
*                                                                                                     *
*  Pinging 127.0.0.1 with 32 bytes of data:                                          *
*                                                                                                     *
*  Reply from 127.0.0.1: bytes=32 time<1ms TTL=128                        *
*  Reply from 127.0.0.1: bytes=32 time<1ms TTL=128                        *
*  Reply from 127.0.0.1: bytes=32 time<1ms TTL=128                        *
*  Reply from 127.0.0.1: bytes=32 time<1ms TTL=128                        *
*                                                                                                     *
*  Ping statistics for 127.0.0.1:                                                          *
*     Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),                    *
*  Approximate round trip times in milli-seconds:                                 *
*     Minimum = 0ms, Maximum = 0ms, Average = 0ms                        *
*                                                                                                    *
\********************************************************/



]]>
վ֩ģ壺 | | ȫ| | ǿ| | ˮ| | | ֥| Ī| ƽ̶| | | | | ǭ| Դ| ƽ| | | | Dz| | | ˮ| | | Ƹ| ͺ| | ̨ɽ| ͼ| | | ɽ| | μ| ϴ| ղ| ʯɽ|