今天本來想偷個懶,直接拿demo的一個chat代碼做一個監控服務程序。采用的是傳統的CSocket和CArchive方式處理序列化消息發送既可以了。
在做的途中,覺得搞一個線程處理讀一個list字符串,有字符串就調用CSocket繼承類,通過序列化方法發送出去就可以了。
結果修改運行后,卻本來想偷懶卻變出偷不了懶,在通過序列化方式發送老是報一個Sockcore.cpp中的566的ASSERT錯誤。
#ifdef _DEBUG
void CAsyncSocket::AssertValid() const
{
CObject::AssertValid();
ASSERT(m_hSocket == INVALID_SOCKET || CAsyncSocket::FromHandle(m_hSocket) != NULL);
}
仔細看這個ASSERT,就是報socket的問題。
程序反復看了看,也沒有查出問題。在google搜了搜,
http://topic.csdn.net/t/20020521/20/741527.html
http://topic.csdn.net/t/20020626/12/830990.html
從中有些啟發,把send部分從線程中采用主線程發送,立馬解決問題。看來CSocket的繼承類是估計不支持在線程模式下運行。也有人說CSocket繼承類只能用于主線程,而不能在線程中,當然,是否這樣,還需要確認。不過,如果想寫線程下的socket類,最好還是從socket構造吧,免得繞彎路。否則,調試來調試去,困惑在深深的MFC代碼內核代碼中簡直是浪費時間。