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