我用原始套接字做了一个网络接收程序。运行时PING另一台主机,出现一个奇怪的现象:
1、在DEBUG模式下,能够捕获到发送给对方的PING包和对方回送的PING包,即每次2包;
2、在RELEASE模式下,只能够捕获到对方回送的PING包,捕获不到自己给对方的PING包,即每次1包。测试UDP包,接收发送正常,能够捕获到。大家帮我分析一下,为什么DEBUG和RELEASE(MFC中的SET ACTIVE PROJECT CONFIGURATION)会出现不同的结果,有什么方法能够解决?
先谢谢了!
1、在DEBUG模式下,能够捕获到发送给对方的PING包和对方回送的PING包,即每次2包;
2、在RELEASE模式下,只能够捕获到对方回送的PING包,捕获不到自己给对方的PING包,即每次1包。测试UDP包,接收发送正常,能够捕获到。大家帮我分析一下,为什么DEBUG和RELEASE(MFC中的SET ACTIVE PROJECT CONFIGURATION)会出现不同的结果,有什么方法能够解决?
先谢谢了!
编译部分我都是用MFC自动生成的,我不会也不懂去修改这部分。
我测试了一下,发现修改一个编译条件,就可以收到完整的PING包。在RELEASE版本下,选择project→settings→c/c++→optimizations,将maximize speed 改为disable(debug),就可以收到有关的包了。
/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
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)
大家能告诉我这是什么原因,这是否是问题所在?怎么解决警告的问题(找不到警告中"/"对应的行)?
后来查了一下,是编译中多出来一个‘/’,去掉就没有警告了。DEBUG版和RELEASE版的运行结果依然有区别。
谢谢老蒋的回复。我按你说的方法在release中进行单步调试,断点设在接收线程的recvfrom函数之下。发现捕获到下列包(即程序能够执行到断点):
1、发往本机的UDP单播包;
2、本机PING其它机器的回复PING包(即接收地址为本机的那个包)。其它电脑PING本机时,程序不能执行到断点,也就是没有捕获到那些PING包。而在DEBUG模式下,则能够捕获到下列包:
1、所有UDP包:包括单播包、组播包、广播包;
2、PING包和回复PING包(包括本机PING其它机和其它机PING本机)。
是由于一个成员变量没有初始化导致的。
BOOL的成员变量没有初始化的时候,DEBUG下和Release下不一样
会自动帮你初始化所有变量为0
而RELEASE下则不会一般你还是检查你代码的初始化问题吧
另外,请问一下大家:
变量的初始化是放在类的构造函数中,还是放在类中的OnInitial函数中好?
有什么区别?
哪个会更健壮一些?
另外,请问一下大家:
变量的初始化是放在类的构造函数中,还是放在类中的OnInitial函数中好?
有什么区别?
哪个会更健壮一些?
在类中我定义了3个sockadd_in 成员变量,都没有在构造函数中初始化(现在也不知道这类变量怎么初始化)。其中一个变量只被一个函数调用,我就将这个成员变量改为函数内部变量;另外2个不改变。
重新编译,就通了。所有应该捕获的数据都抓到了。
虽说程序正常了,但今后仍需学习如何初始化sockadd_in这类变量。再次谢谢。