下面是我读别人的一个网络嗅探程序中遇到的一些问题,希望大家指教。
1.在VC6.0的Workspace下面ClassView ,ResourceView,FileView中的FileView下面在什么情况下会出现
External Dependencies文件夹。
2.External Dependencies里面常常出现的basetsd.h是做什么的。什么时候出现?External Dependencies里面的头文件和Header Files里面的有什么不同?
3.在我读的程序里面External Dependencies里面加入了AFXSOCK.H,mstcpip.h等等文件。我想问问
是怎么加的,我只会在Header Files里面加。想拖动却拖不到External Dependencies里面。
希望能详细说下。

解决方案 »

  1.   

    External Dependencies里面显示的是你的工程要用到的头文件,不在你的工程里面,而且也不在VC的默认包含文件SYSINCL.dat中。
      

  2.   

    External Dependencies里面只是列出所需要的吗
      

  3.   

    那么那个例子中只在.cpp中加入了#include "mstcpip.h"
    #include "afxsock.h"
    #include "Iphlpapi.h"
    可是External Dependencies里面列出了更多的,
      

  4.   

    mstcpip.h依赖于其他的头文件,你可以打开它看看,一定会发现,mstcpip.h用#include包含了许多其他的头文件。
      

  5.   

    错了,应该是
    #include "afxsock.h"
    #include "Iphlpapi.h"
    两个包含了许多其他的头文件。
    mstcpip.h很简单,没什么东西。
      

  6.   

    是的,我也看了,我把所需要的所有头文件都拷到了当前程序所在的文件目录,可是出错如下:
    D:\EXAMPLE3\练习7\Sniffer\SnifferDlg.cpp(559) : error C2065: 'WSAIoctl' : undeclared identifierD:\EXAMPLE3\练习7\Sniffer\SnifferDlg.cpp(559) : error C2065: '_WSAIOW' : undeclared identifierD:\EXAMPLE3\练习7\Sniffer\SnifferDlg.cpp(559) : error C2065: 'IOC_VENDOR' : undeclared identifier
    是不是这样加不对,能说说吗?
      

  7.   

    附上一段程序:
    void CSnifferDlg::OnLookup() 
    {
    // TODO: Add your control notification handler code here
    char        szErr [ 50 ] , szHostName[MAX_PATH];//目录
    DWORD       dwErr ;
        SOCKADDR_IN sa; gethostname(szHostName, sizeof(szHostName)) ;
    m_iphostsource = m_ipsource ;
        
      m_ipcheckedhost = ntohl(m_iphost) ;
    //The Windows Sockets ntohl function converts a u_long 
    //from TCP/IP network order to host byte order,与htonl
    //相反 if( 0 == m_threadID )//第一次按键后执行
    {
    SetDlgItemText(IDC_LOOKUP,"停止查看!" );
    }
    else
    {
    if( m_threadID )
    {
                  PostThreadMessage(m_threadID,WM_CLOSE,0,0) ;
    //传递一个线程的消息到消息队列
            SetDlgItemText(IDC_LOOKUP,"开始查看!");
    m_start.EnableWindow(FALSE) ;
    }
    return ;
    }
    //////////////////////
         DWORD dwBufferLen[10] ;//DWORD is unsigned long
    DWORD dwBufferInLen= 1 ;
    DWORD dwBytesReturned = 0 ;
    m_s = socket( AF_INET , SOCK_RAW , IPPROTO_IP ) ;//套接字
    ////////////////////
    if( INVALID_SOCKET == m_s )
    {
    dwErr = WSAGetLastError() ;
    sprintf( szErr , "Error socket() = %ld " , dwErr ) ;
    AfxMessageBox( szErr ) ;
    closesocket( m_s ) ;
    return ;
    }
    ///////////////////
    //另外一种错误判断
    int rcvtimeo = 5000 ; 
            if( setsockopt( m_s , SOL_SOCKET , SO_RCVTIMEO , 
    (const char *)&rcvtimeo , sizeof(rcvtimeo) ) == SOCKET_ERROR)
    {
    dwErr = WSAGetLastError() ;
    sprintf( szErr , "Error WSAIoctl = %ld " , dwErr ) ;
    AfxMessageBox( szErr ) ;
    closesocket( m_s ) ;
    return ;
    }
    ///////////////////
    sa.sin_family = AF_INET;
      sa.sin_port = htons(7000);//选择服务端口
    sa.sin_addr.s_addr= m_iphostsource;//选择IP地址
            if (bind(m_s,(PSOCKADDR)&sa, sizeof(sa)) == SOCKET_ERROR)
    {
    dwErr = WSAGetLastError() ;
    sprintf( szErr , "Error bind() = %ld " , dwErr ) ;
    AfxMessageBox( szErr ) ;
    closesocket( m_s ) ;
    return ;

            if( SOCKET_ERROR != WSAIoctl( m_s, SIO_RCVALL , &dwBufferInLen, 
    sizeof(dwBufferInLen),&dwBufferLen, sizeof(dwBufferLen),
    &dwBytesReturned , NULL , NULL ) )//WSAIoctl控制SOCKET模式
    {
    //开启线程
                AfxBeginThread( threadFunc , (LPVOID)this );
    }
    else
    {
    dwErr = WSAGetLastError() ;
    sprintf( szErr , "Error WSAIoctl = %ld " , dwErr ) ;
    AfxMessageBox( szErr ) ;
    closesocket( m_s ) ;//关闭socket
    return ;
    }
    }
      

  8.   

    在头文件里加上:
    #include "Winsock2.h"
    #pragma comment(lib "Ws2_32.lib")
    //////////////////////////////////////////
     WSAIoctl、_WSAIOW、'IOC_VENDOR 的声明都在sock2库里。
      

  9.   

    发到我邮箱:JuJoKing@hotmail.com
      

  10.   

    External Dependencies里面的头文件和Header Files里面的有什么不同?
    里面是你工程设置等包含了文件夹进去,列出所有的相关文件
    Header Files包含了你工程引用的头文件等,
      

  11.   

    Ok,好了。我给你发回去了,就改了Stdafx.h和SnifferDlg.cpp。
    包含头文件要注意,有的头文件有先后包含的问题,否则可能会有影响。
    另,发源代码的时候,
    记得把Debug目录和Release目录去掉,占空间,没用,还影响收信速度
    ^_^
      

  12.   

    2.Resource.h文件中的资源ID最好由VC自己管理,手工添加的可能会有问题。
    会出现编译后,某些事件无法触发。
    至于,哪个控件关联哪个ID可以在VC资源编辑器中看它的属性可以看到。
    3.比较字符串,不能简单的用==,应该用strcmp之类的字符串比较函数。
      

  13.   

    3.比较字符串,不能简单的用==,应该用strcmp之类的字符串比较函数。
    这个我还想了解一下,我之前做了个VC通过ODBC数据源连接SQL Server表的程序,
    对表实施简单的查询,删除,添加,排序等。
    查询时候用厂商名(中文的)做判断条件时候,就查询不出来,后来只能用厂商号查询。
    数字的,才行,我当时用了==,也用了strcmp,但都不行,是不是中文名,还有别的函数
    比较啊
      

  14.   

    你读写、SQL Server数据库中的中文字段的时候,最好是采用Unicode方式,不然很容易比较中文的时候出错。
      

  15.   

    另外,像_bstr_、CString可以用==比较是因为,他们重载了==的操作符。