我想倒的办法是,用WinSock2的rawSocket取得所有进出的包,然后就可以统计了不过感觉应该有API直接实现

解决方案 »

  1.   

    网络蚂蚁只是统计通过它的速率,不是modem的速率。
      

  2.   

    To Kevin_qinq:问你一个关于rawSocket的问题:
    自己用rawsocket构造一个ip包,请问其中的id字段和check字段该怎么设置,如果我将
    check设为0,系统会在我发包时帮我计算马?                      
      

  3.   

    ID是跟具体协议有关系的,你可以去看看msdn里面的资料,还有可以看看电子工业部的那套TCP/IP(共3卷的).check_sum要自己计算
      

  4.   

    我觉得有可能在RAS的那套函数里的
    对于SOCKET来说都是固定的端口
    是不是要对每一个端口进行扫描呢?
    当然这只是本人的猜想
      

  5.   

    不知道能不能用AT命令跟MODEM通信下面是我的MODEM的报告
    05-24-2001 23:28:43.74 - Intel HaM Data Fax Voice 正在使用。
    05-24-2001 23:28:43.77 - 调制解调器类型: Intel HaM Data Fax Voice
    05-24-2001 23:28:43.77 - 调制解调器信息路径: MDMHAM.INF
    05-24-2001 23:28:43.77 - 调制解调器信息段: HaM
    05-24-2001 23:28:45.56 - 115200,N,8,1
    05-24-2001 23:28:45.57 - 115200,N,8,1
    05-24-2001 23:28:45.61 - 正在初始化调制解调器。05-24-2001 23:28:45.61 - 发送: AT<cr>
    05-24-2001 23:28:45.62 - 接收: AT<cr>
    05-24-2001 23:28:45.77 - 接收: <cr><lf>OK<cr><lf>
    05-24-2001 23:28:45.77 - 已翻译的响应: 确定
    05-24-2001 23:28:45.77 - 发送: AT&F E0 Q0 X4 S0=0 &D2 &C1 &S0 V1 W4<cr>
    05-24-2001 23:28:45.80 - 接收: AT&F E0 Q0 X4 S0=0 &D2 &C1 &S0 V1 W4<cr>
    05-24-2001 23:28:45.98 - 接收: <cr><lf>OK<cr><lf>
    05-24-2001 23:28:45.98 - 已翻译的响应: 确定
    05-24-2001 23:28:45.98 - 发送: ATS7=60S30=0L0M1+ES=3,0,2;%C1+DS=3,0;<cr>
    05-24-2001 23:28:46.16 - 接收: <cr><lf>OK<cr><lf>
    05-24-2001 23:28:46.16 - 已翻译的响应: 确定
    05-24-2001 23:28:46.16 - 发送: AT&K3X4<cr>
    05-24-2001 23:28:46.35 - 接收: <cr><lf>OK<cr><lf>
    05-24-2001 23:28:46.35 - 已翻译的响应: 确定
    05-24-2001 23:28:46.36 - 正在拨号。
    05-24-2001 23:28:46.36 - 发送: ATDT######<cr>
    05-24-2001 23:29:13.63 - 接收: <cr><lf>PROTOCOL: LAP-M<cr><lf>
    05-24-2001 23:29:13.63 - 已翻译的响应: 丰富的资料
    05-24-2001 23:29:13.63 - 接收: <cr><lf>COMPRESSION: V.42BIS<cr><lf>
    05-24-2001 23:29:13.63 - 已翻译的响应: 丰富的资料
    05-24-2001 23:29:13.63 - 接收: <cr><lf>CONNECT 50666<cr><lf>
    05-24-2001 23:29:13.63 - 已翻译的响应: 连接
    05-24-2001 23:29:13.63 - 已建立连接的传输速度为 50666bps。
    05-24-2001 23:29:13.63 - 错误控制打开。
    05-24-2001 23:29:13.63 - 数据压缩打开。
    05-24-2001 23:35:31.37 - 正在挂断调制解调器。
    05-24-2001 23:35:31.37 - 降低 DTR 以挂起硬件。
    05-24-2001 23:35:32.09 - 接收: <cr><lf>OK<cr><lf>
    05-24-2001 23:35:32.09 - 已翻译的响应: 确定
    05-24-2001 23:35:32.09 - 发送: ATH<cr>
    05-24-2001 23:35:32.44 - 接收: <cr><lf>OK<cr><lf>
    05-24-2001 23:35:32.44 - 已翻译的响应: 确定
    05-24-2001 23:35:32.44 - 115200,N,8,1
    05-24-2001 23:35:32.50 - 会话统计:
    05-24-2001 23:35:32.50 -             读取 : 191668 字节
    05-24-2001 23:35:32.50 -             写入: 74911 字节
    05-24-2001 23:35:32.50 - Intel HaM Data Fax Voice 已关闭。
      

  6.   

    能用AT指令
    但太复杂了
    我还是用RAS(REMOTE ACCESS SERVICE)来完成拨号
    而且HRASCONN也能得到大部分的返回信息
      

  7.   

    我知道一个很简单的解决方法了,可惜只能在Win98/WinME下用,Winnt/Win2000不能用。不能给自己加分?:-)
      

  8.   

    我知道一个很简单的解决方法了,可惜只能在Win98/WinME下用,Winnt/Win2000不能用。不能给自己加分?:-)
      

  9.   

    H文件:rasSpdM.h #ifndef __RASSPDMON_H_
    #define __RASSPDMON_H_void InitSpeedMonitor(void);
    void ClearSpeedMonitor(void);
    void GetRASSpeed(DWORD* pTPS,DWORD* pRPS,DWORD* pTT,DWORD* pRT);
    ////参数:每秒发送,每秒接收,总发送,总接受
    #endifCPP文件rasSpdM.cpp#include "stdafx.h"
    #include "rasSpdM.h"
    #include #define TOTALBYTES    4096
    #define BYTEINCREMENT 1024LPSTR lpNameStrings=NULL;
    LPSTR *lpNamesArray=NULL;
    BOOL glo_fFromDynReg=TRUE;/*
    在9x下通过dyn_data注册表得到速度
    */
    DWORD GetTotalRecv(void)
    {
    HKEY hKey;
    DWORD dwValue=(DWORD)-1;
    if(0==RegOpenKey(HKEY_DYN_DATA,"PerfStats\\StatData",&hKey))
    {
    DWORD dwType,dwLen=sizeof(DWORD);
    RegQueryValueEx(hKey,"Dial-Up Adapter\\TotalBytesRecvd",NULL,&dwType,(BYTE*)&dwValue,&dwLen);
    RegCloseKey(hKey);
    }
    return dwValue;
    }
    DWORD GetTotalXmit(void)
    {
    HKEY hKey;
    DWORD dwValue=(DWORD)-1;
    if(0==RegOpenKey(HKEY_DYN_DATA,"PerfStats\\StatData",&hKey))
    {
    DWORD dwType,dwLen=sizeof(DWORD);
    RegQueryValueEx(hKey,"Dial-Up Adapter\\TotalBytesXmit",NULL,&dwType,(BYTE*)&dwValue,&dwLen);
    RegCloseKey(hKey);
    }
    return dwValue;
    }
    DWORD GetPerSecondRecv(void)
    {
    HKEY hKey;
    DWORD dwValue=(DWORD)-1;
    if(0==RegOpenKey(HKEY_DYN_DATA,"PerfStats\\StatData",&hKey))
    {
    DWORD dwType,dwLen=sizeof(DWORD);
    RegQueryValueEx(hKey,"Dial-Up Adapter\\BytesRecvd",NULL,&dwType,(BYTE*)&dwValue,&dwLen);
    RegCloseKey(hKey);
    }
    return dwValue;
    }
    DWORD GetPerSecondXmit(void)
    {
    HKEY hKey;
    DWORD dwValue=(DWORD)-1;
    if(0==RegOpenKey(HKEY_DYN_DATA,"PerfStats\\StatData",&hKey))
    {
    DWORD dwType,dwLen=sizeof(DWORD);
    RegQueryValueEx(hKey,"Dial-Up Adapter\\BytesXmit",NULL,&dwType,(BYTE*)&dwValue,&dwLen);
    RegCloseKey(hKey);
    }
    return dwValue;
    }/*****************************************************************
    在NT下通过per Data得到
     *****************************************************************/PPERF_OBJECT_TYPE FirstObject( PPERF_DATA_BLOCK PerfData )
    {
        return( (PPERF_OBJECT_TYPE)((PBYTE)PerfData + 
            PerfData->HeaderLength) );
    }PPERF_OBJECT_TYPE NextObject( PPERF_OBJECT_TYPE PerfObj )
    {
        return( (PPERF_OBJECT_TYPE)((PBYTE)PerfObj + 
            PerfObj->TotalByteLength) );
    }PPERF_INSTANCE_DEFINITION FirstInstance( PPERF_OBJECT_TYPE PerfObj )
    {
        return( (PPERF_INSTANCE_DEFINITION)((PBYTE)PerfObj + 
            PerfObj->DefinitionLength) );
    }PPERF_INSTANCE_DEFINITION NextInstance( 
        PPERF_INSTANCE_DEFINITION PerfInst )
    {
        PPERF_COUNTER_BLOCK PerfCntrBlk;    PerfCntrBlk = (PPERF_COUNTER_BLOCK)((PBYTE)PerfInst + 
            PerfInst->ByteLength);    return( (PPERF_INSTANCE_DEFINITION)((PBYTE)PerfCntrBlk + 
            PerfCntrBlk->ByteLength) );
    }PPERF_COUNTER_DEFINITION FirstCounter( PPERF_OBJECT_TYPE PerfObj )
    {
        return( (PPERF_COUNTER_DEFINITION) ((PBYTE)PerfObj + 
            PerfObj->HeaderLength) );
    }PPERF_COUNTER_DEFINITION NextCounter( 
        PPERF_COUNTER_DEFINITION PerfCntr )
    {
        return( (PPERF_COUNTER_DEFINITION)((PBYTE)PerfCntr + 
            PerfCntr->ByteLength) );
    }/*****************************************************************
     *                                                               *
     * Load the counter and object names from the registry to the    *
     * global variable lpNamesArray.                                 *
     *                                                               *
     *****************************************************************/void GetNameStrings( )
    {
        HKEY hKeyPerflib;      // handle to registry key
        HKEY hKeyPerflib009;   // handle to registry key
        DWORD dwMaxValueLen;   // maximum size of key values
        DWORD dwBuffer;        // bytes to allocate for buffers
        DWORD dwBufferSize;    // size of dwBuffer
        LPSTR lpCurrentString; // pointer for enumerating data strings
        DWORD dwCounter;       // current counter index// Get the number of Counter items.    RegOpenKeyEx( HKEY_LOCAL_MACHINE,
            "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Perflib",
            0,
            KEY_READ,
            &hKeyPerflib);    dwBufferSize = sizeof(dwBuffer);    RegQueryValueEx( hKeyPerflib,
            "Last Counter",
            NULL,
            NULL,
            (LPBYTE) &dwBuffer,
            &dwBufferSize );    RegCloseKey( hKeyPerflib );// Allocate memory for the names array.    lpNamesArray = (char**)malloc( (dwBuffer+1) * sizeof(LPSTR) );
    // Open key containing counter and object names.    RegOpenKeyEx( HKEY_LOCAL_MACHINE,
        "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Perflib\\009",
            0,
            KEY_READ,
            &hKeyPerflib009);// Get the size of the largest value in the key (Counter or Help).    RegQueryInfoKey( hKeyPerflib009,
            NULL,
            NULL,
            NULL,
            NULL,
            NULL,
            NULL,
            NULL,
            NULL,
            &dwMaxValueLen,
            NULL,
            NULL);// Allocate memory for the counter and object names.    dwBuffer = dwMaxValueLen + 1;    lpNameStrings = (char*)malloc( dwBuffer * sizeof(CHAR) );// Read Counter value.    RegQueryValueEx( hKeyPerflib009,
            "Counter",
            NULL,
            NULL,
            (BYTE*)lpNameStrings, &dwBuffer );// Load names into an array, by index.    int iC=1;
    for( lpCurrentString = lpNameStrings; *lpCurrentString;
             lpCurrentString += (lstrlen(lpCurrentString)+1) )
        {
            dwCounter = atol( lpCurrentString );
            lpCurrentString += (lstrlen(lpCurrentString)+1); //printf("%d length=%d data=%s\n",iC++,dwCounter,lpCurrentString);
            lpNamesArray[dwCounter] = (LPSTR) lpCurrentString;
        }
    }/*****************************************************************
    得到下RAS速度
     *****************************************************************/
    void GetRASSpeedOn9X(DWORD* pTPS,DWORD* pRPS,DWORD* pTT,DWORD* pRT)
    {// under 9x
    *pTPS=GetPerSecondXmit();
    *pRPS=GetPerSecondRecv();
    *pTT=GetTotalXmit();
    *pRT=GetTotalRecv();
    }void GetRASSpeedOnNT(DWORD* pTPS,DWORD* pRPS,DWORD* pTT,DWORD* pRT)
    {// under NT
    ////参数:每秒发送,每秒接收,总发送,总接受
        PPERF_DATA_BLOCK PerfData = NULL;
        PPERF_OBJECT_TYPE PerfObj;
        PPERF_INSTANCE_DEFINITION PerfInst;
        PPERF_COUNTER_DEFINITION PerfCntr, CurCntr;
        PPERF_COUNTER_BLOCK PtrToCntr;
        DWORD BufferSize = TOTALBYTES;
        DWORD i, j, k;// Get the name strings through the registry. //return;
    // Allocate the buffer for the performance data.    PerfData = (PPERF_DATA_BLOCK) malloc( BufferSize );    while( RegQueryValueEx( HKEY_PERFORMANCE_DATA,
                                   "906",//"Global",
                                   NULL,
                                   NULL,
                                   (LPBYTE) PerfData,
                                   &BufferSize ) == ERROR_MORE_DATA )
        {
        // Get a buffer that is big enough.        BufferSize += BYTEINCREMENT;
            PerfData = (PPERF_DATA_BLOCK) realloc( PerfData, BufferSize );
        }// Get the first object type.    PerfObj = FirstObject( PerfData );// Process all objects.    //printf("object total=%d\n",PerfData->NumObjectTypes);
    //getchar();
    for( i=0; i < PerfData->NumObjectTypes; i++ )
        {
        // Display the object by index and name.    // Get the first counter.        PerfCntr = FirstCounter( PerfObj );        if( PerfObj->NumInstances > 0 )
            {
    //exit(0);
            }
            else
            {
            // Get the counter block.
                PtrToCntr = (PPERF_COUNTER_BLOCK) ((PBYTE)PerfObj +
                                PerfObj->DefinitionLength );        // Retrieve all counters.            for( j=0; j < PerfObj->NumCounters; j++ )
                {
                // Display the counter by index and name.               
    if(strcmp("Bytes Transmitted/Sec",lpNamesArray[PerfCntr->CounterNameTitleIndex])==0)
    {
    *pTPS=*((DWORD*)((BYTE*)PtrToCntr+PerfCntr->CounterOffset));
    }
    if(strcmp("Bytes Received/Sec",lpNamesArray[PerfCntr->CounterNameTitleIndex])==0)
    {
    *pRPS=*((DWORD*)((BYTE*)PtrToCntr+PerfCntr->CounterOffset));
    }
                    if(strcmp("Bytes Transmitted",lpNamesArray[PerfCntr->CounterNameTitleIndex])==0)
    {
    *pTT=*((DWORD*)((BYTE*)PtrToCntr+PerfCntr->CounterOffset));
    }
                    if(strcmp("Bytes Received",lpNamesArray[PerfCntr->CounterNameTitleIndex])==0)
    {
    *pRT=*((DWORD*)((BYTE*)PtrToCntr+PerfCntr->CounterOffset));
    }
    // Get the next counter.
    PerfCntr = NextCounter( PerfCntr );
    }
    }    // Get the next object type.
            PerfObj = NextObject( PerfObj );
        }
    }void GetRASSpeed(DWORD* pTPS,DWORD* pRPS,DWORD* pTT,DWORD* pRT)
    {////参数:每秒发送,每秒接收,总发送,总接受
    if(glo_fFromDynReg==FALSE)
    {
    GetRASSpeedOnNT(pTPS,pRPS, pTT,pRT);
    }
    else
    {
    GetRASSpeedOn9X(pTPS,pRPS, pTT,pRT);
    }
    }void InitSpeedMonitor(void)
    {
    DWORD dwVersion = GetVersion();
    // Get major and minor version numbers of Windows
    DWORD dwWindowsMajorVersion =  (DWORD)(LOBYTE(LOWORD(dwVersion)));
    DWORD dwWindowsMinorVersion =  (DWORD)(HIBYTE(LOWORD(dwVersion)));
    // Get build numbers for Windows NT or Win32s
    if (dwVersion>>31 ==0)                // Windows NT
    {
    glo_fFromDynReg=FALSE;
    GetNameStrings( );
    }
    else         // Windows 95 - 98
    glo_fFromDynReg=TRUE;
    }
    void ClearSpeedMonitor(void)
    {
    if(lpNameStrings)
    free(lpNameStrings);
    if(lpNamesArray)
    free(lpNamesArray);
    }
    使用方法:#include "rasSpdM.h"
    BOOL CYourApp::InitInstance()
    {
    //初始化RAS速度访问
    InitSpeedMonitor();...
    }
    #include "rasSpdM.h"
    void CYourWnd::OnTimer(UINT nIDEvent) 
    {
    DWORD dwR,dwS,dwPSR,dwPSS;//总接收,总发送,每秒接收,每秒发送
    GetRASSpeed(&dwPSS,&dwPSR,&dwS,&dwR);//pTPS,DWORD* pRPS,DWORD* pTT,DWORD* pRT)
    //参数:每秒发送,每秒接收,总发送,总接收
    ...
    }
      

  10.   

    Thank you,和我的方法一样的:-(,可惜在win2000不能用。有无2000下也能用的方法,我分给了,有好方法我再加分。