我用原始套接字做了一个网络接收程序。运行时PING另一台主机,出现一个奇怪的现象:
1、在DEBUG模式下,能够捕获到发送给对方的PING包和对方回送的PING包,即每次2包;
2、在RELEASE模式下,只能够捕获到对方回送的PING包,捕获不到自己给对方的PING包,即每次1包。测试UDP包,接收发送正常,能够捕获到。大家帮我分析一下,为什么DEBUG和RELEASE(MFC中的SET ACTIVE PROJECT CONFIGURATION)会出现不同的结果,有什么方法能够解决?
先谢谢了!

解决方案 »

  1.   

    先说明一下,编译没有任何错误。测试UDP包,能正常接收显示的。
      

  2.   

    在release配置里面加调试信息(program database)单步调试一下
      

  3.   

    那要先弄清楚Debug和Release编译有什么不同
      

  4.   

    可能加了 条件编译段 #if release .........
      

  5.   

    预编译条件?
    编译部分我都是用MFC自动生成的,我不会也不懂去修改这部分。
      

  6.   


    我测试了一下,发现修改一个编译条件,就可以收到完整的PING包。在RELEASE版本下,选择project→settings→c/c++→optimizations,将maximize speed 改为disable(debug),就可以收到有关的包了。
      

  7.   

    下面是两个编译选项的区别:选择 maximize speed
    /nologo /MD /W3 /GX /Zi /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_AFXDLL" /D "_MBCS" /FR"Release/" /Fp"Release/net.pch" /Yu"stdafx.h" /Fo"Release/" /Fd"Release/" /FD /c 
    选择 disable(debug):/nologo /MD /W3 /GX /Zi /Od /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_AFXDLL" /D "_MBCS" /FR"Release/" /Fp"Release/net.pch" /Yu"stdafx.h" /Fo"Release/" /Fd"Release/" /FD /c 核对了一下,只看到其中一项不同:  /O2 →/Od 
      

  8.   

    虽然release版选择 disable(debug)时,能够接收到有关的数据了。但编译时出现警告。Compiling resources...
    Compiling...
    Command line warning D4002 : ignoring unknown option '/'
    StdAfx.cpp
    Compiling...
    Command line warning D4002 : ignoring unknown option '/'
    excel.cpp
    net.cpp
    netDlg.cpp
    SendData.cpp
    Generating Code...
    Linking...
    Creating browse info file...net.exe - 0 error(s), 2 warning(s)不同的是,debug版的默认选项没有任何警告:
    Compiling resources...
    Compiling...
    StdAfx.cpp
    Compiling...
    excel.cpp
    net.cpp
    netDlg.cpp
    SendData.cpp
    Generating Code...
    Linking...net.exe - 0 error(s), 0 warning(s)
    大家能告诉我这是什么原因,这是否是问题所在?怎么解决警告的问题(找不到警告中"/"对应的行)?
      

  9.   


    后来查了一下,是编译中多出来一个‘/’,去掉就没有警告了。DEBUG版和RELEASE版的运行结果依然有区别。
      

  10.   


    谢谢老蒋的回复。我按你说的方法在release中进行单步调试,断点设在接收线程的recvfrom函数之下。发现捕获到下列包(即程序能够执行到断点):
    1、发往本机的UDP单播包;
    2、本机PING其它机器的回复PING包(即接收地址为本机的那个包)。其它电脑PING本机时,程序不能执行到断点,也就是没有捕获到那些PING包。而在DEBUG模式下,则能够捕获到下列包:
    1、所有UDP包:包括单播包、组播包、广播包;
    2、PING包和回复PING包(包括本机PING其它机和其它机PING本机)。
      

  11.   

    曾经遇到过类似的问题。
    是由于一个成员变量没有初始化导致的。
    BOOL的成员变量没有初始化的时候,DEBUG下和Release下不一样
      

  12.   

    DEBUG下
    会自动帮你初始化所有变量为0
    而RELEASE下则不会一般你还是检查你代码的初始化问题吧
      

  13.   

    再检查一下变量的初始化。
    另外,请问一下大家:
    变量的初始化是放在类的构造函数中,还是放在类中的OnInitial函数中好?
    有什么区别?
    哪个会更健壮一些?
      

  14.   

    再检查一下变量的初始化。
    另外,请问一下大家:
    变量的初始化是放在类的构造函数中,还是放在类中的OnInitial函数中好?
    有什么区别?
    哪个会更健壮一些?
      

  15.   

    谢谢各位高手的帮助,问题终于解决了。
    在类中我定义了3个sockadd_in 成员变量,都没有在构造函数中初始化(现在也不知道这类变量怎么初始化)。其中一个变量只被一个函数调用,我就将这个成员变量改为函数内部变量;另外2个不改变。
    重新编译,就通了。所有应该捕获的数据都抓到了。
    虽说程序正常了,但今后仍需学习如何初始化sockadd_in这类变量。再次谢谢。