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);
}