20日
用visual studio 10.0打开项目,第一次编译项目,报出了“
fatal error C1902: 程序数据库管理器不匹配;请检查安装”的错误,但项目在上星期五都能编译成功,
现在没有修改,却编译失败。编译其它语言的项目不受影响。
http://msdn.microsoft.com/zh-cn/library/8y7hea02.aspx是关于该问题的官方分析,于是我检查相关的DLL文件,也都存在且版本一致。突然想起周五下午,
在使用vc10.0中的dumpbin时,提示少了mspdb100.dll文件,我就从Microsoft Visual Studio 10.0\Common7\IDE目录中复制了该文件到
Microsoft Visual Studio 10.0\VC\bin中,把bin中的该文件删除后,再编译项目就成功了。
23日
程序每次隔几分钟去查询服务器。响应时间都会更长,特别是数据量少时更是慢。
通过wireshark工具分析网络包,发现发生这个情况时总是发生了重传并出现了ARP请求应答包。于是试着清除ARP缓存,然后再查询,情况一般都能复现。由此再
想到网络协议ARP的介绍,得出结论是分片的IP包只有最后一包会由ARP应答处理,之前的都会被丢弃。数据量少时更明显的原因是没有3个以上重复的ACK来告诉
需要重传,只有等待超时机制,而超时机制一般都需要200多ms,所以现象更明显。
ARP 缓存表的更新。
在注册表的HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters 下有两个键可用来控制缓存表的更新周期。
ArpCacheLife REG_DWORD 0-0xFFFFFFFF(秒数,默认值为120秒):是指没有引用过(也就是和对方没有通信)的缓存项失效时间。
ArpCacheMinReferencedLife REG_DWORD 0-0xFFFFFFFF(秒数,默认值为600):是指引用过(也就是和对方有网络通信)的缓存项失效时间。
24日
程序在服务器上运行,点出关闭,迟迟不能退出。
用调试器附加进程,查看线程及各自的栈k,分析出有死循环。冻结其它线程~f,于循环判断处下断bp,查看相关存储位置的值dd [ebp-38],更改其值ed [ebp-38]
查看寄存器eax的值reax,并重新赋值reax=1,从而让程序完成退出时的逻辑。
25日
套接字模式分为两种。
阻塞模式:在阻塞模式下,I/O操作完成前,执行操作的调用send,recv会一直等候下去,不会立即返回到程序。
非阻塞模式:在非阻塞模式下,调用send,recv等I/O操作时,操作会立即返回到程序。
windows上套接字上的I/O模型共有6种。
阻塞模型:模型使用阻塞模式的套接字,收发线程上进行的都是阻塞调用。特点是简单,缺点是不易扩展。
select模型:可以同时管理阻塞套按字和非阻塞套接字。
WSAAsyncSelect模型:可以绑定到窗口的消息上,只能用非阻塞套接字上。
WSAEventSelect模型:和一个事件句柄关联,只能用非阻塞套接字上。
Overlapped I/O模型:可以和一个事件句柄或者一个完成回调方法关联,只能用非阻塞套接字上。
完成端口模型:只能用非阻塞套接字上。
在一个阻塞或者非阻塞套接字上投递recv操作时,默认的选项的行为是只要有数据就会返回。如果要让套接字收到指定的数据量后才返回,需要在recv调用中指定MSG_WAITALL
标志。
30日
MFC对话框上的ENTER,ESC及右上角的关闭按钮处理
在MFC对话框上按ENTER键
1:如果当前焦点是在一个按钮上,相当于单击该按钮。
2:如果当前焦点是在其它类型的控件上时。
2.1:如果设置了DEFAULT BUTTON按钮,就相当于单击了该默认按钮。
2.3:如果映射了IDOK消息号,将会调用该消息函数
2.2:如果没有设置DEFAULT BUTTON按钮,将会调用对话框类的OnOK函数。
在MFC对话框上按下了ESC键
1:如果映射了IDCANCEL消息号,将会调用该消息函数。
2:如果没有映射IDCANCEL消息号,将会调用对话框类的OnCancel函数。
单击对话框右上角的关闭按钮
1:如果映射了对话框WM_CLOSE消息,将调用该处理函数OnClose(),基类的OnClose()函数将会调用OnCancel函数。
2:同在MFC对话框上按下了ESC键处理流程一样。
参照上述的流程就可以灵活处理对话框上这几个消息,也有人通过重载基类的BOOL PreTranslateMessage(MSG* pMsg) 来处理
BOOL PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
if (pMsg-> message==WM_KEYDOWN)
{
UINT nkeyc=(UINT)(pMsg-> wParam);
if(nkeyc==VK_ESCAPE)
return TRUE; // 表示已经处理好了,不需再进行处理。
}
return CDialog::PreTranslateMessage(pMsg);
}