求救,使用CBlockingSocket一接收数据,程序就出错!
在视图类中启动建立服务器端Socket线程,然后在服务器线程中接收连接,建立客户处理线程.客户处理线程解析报文并做相应的处理.
现在的问题是,客户处理线程一接收数据,程序就甭掉了,郁闷ing,还请大侠救我!
全局变量和包文头定义:
//define global variables.
UINT g_nPortServer = 3313;
int g_nConnection = 0;
BOOL g_bListening = FALSE;
CBlockingSocket g_sListen;
#define MAXBUF 2048
typedef ::std::vector<CBlockingSocket *> SocketVector;
SocketVector g_vClientSocket;
typedef struct _MsgHead //消息头
{
WORD wVersion; //版本信息
WORD wFlag; //消息标志
WORD wType; //消息类别
WORD wMsgLen; //消息长度
} MsgHead;
视图类
void CBookServerView::OnServeStart()
{
char szErrMsg[255];
try
{
CSockAddr saServer = CSockAddr(INADDR_ANY, (USHORT)g_nPortServer);
g_sListen.Create();
g_sListen.Bind(saServer);
g_sListen.Listen();// start listening
g_bListening = TRUE;
g_nConnection = 0;
AfxBeginThread(ServerThreadProc, GetSafeHwnd(), THREAD_PRIORITY_NORMAL);
}
catch(CBlockingSocketException* e)
{
g_sListen.Cleanup();
e->GetErrorMessage(szErrMsg, 255);
ErrMsgOutput(szErrMsg);
e->Delete();
}
}
//服务器线程
UINT ServerThreadProc(LPVOID pParam)
{
char szErrMsg[255];
CSockAddr saClient;
CBlockingSocket sClient;
while (1)
{
try
{
CString s;
s.Format("%d", sizeof(LPSOCKADDR));
AfxMessageBox(s);
s.Format("%d", sizeof(saClient));
AfxMessageBox(s);
if (!g_sListen.Accept(sClient, (LPSOCKADDR)&saClient))
{
// view or application closed the listing socket
g_bListening = FALSE;
}
else
{
g_nConnection++;
AfxBeginThread(ClientThreadProc, (LPVOID)&sClient, THREAD_PRIORITY_NORMAL);
}
}
catch (CBlockingSocketException* e)
{
e->GetErrorMessage(szErrMsg, 255);
ErrMsgOutput(szErrMsg);
e->Delete();
}
}
return 0;
} /*end of proc*/
//用户线程
UINT ClientThreadProc(LPVOID pParam)
{
CBlockingSocket * psClient = (CBlockingSocket *)pParam;
char szErrMsg[255];
while(1)
{
try {
// Perform a blocking recv() call
//
char szMsgHead[255];
//memset((void *)szMsgHead, 0, sizeof(MsgHead));
int nBytesRcv = psClient->Receive((char *)szMsgHead, sizeof(MsgHead), 65535); //经过调试发现一到这里就出错了。
// Graceful close
if (0 == nBytesRcv)
{
//管理Socket
for (SocketVector::iterator itv = g_vClientSocket.begin(); itv != g_vClientSocket.end(); ++itv)
{
if (psClient == *itv)
{
g_vClientSocket.erase(itv);
}
}
//g_vClientSocket
g_nConnection --;
break;
}
else if (sizeof(MsgHead) != nBytesRcv)
{
continue;
}
MsgHead *pMsgHead = (MsgHead *)szMsgHead;
//check the correctness of packet.
if (pMsgHead->wVersion >= 100 && pMsgHead->wVersion <= 1000 && pMsgHead->wFlag == sizeof(MsgHead))
{
char* szBuffer = new char[pMsgHead->wMsgLen + 1];
memset(szBuffer, 1, pMsgHead->wMsgLen + 1);
nBytesRcv = psClient->Receive((char *)szBuffer, sizeof(pMsgHead->wMsgLen + 1), 1);
if (0 == nBytesRcv)
{
//管理Socket
for (SocketVector::iterator itv = g_vClientSocket.begin(); itv != g_vClientSocket.end(); ++itv)
{
if (psClient == *itv)
{
g_vClientSocket.erase(itv);
}
}
//g_vClientSocket
g_nConnection --;
break;
}
else if (sizeof(MsgHead) != nBytesRcv)
{
continue;
}
if (100 == pMsgHead->wVersion)
{
switch (pMsgHead->wType)
{
case 1 :
{ //User Login
CSockAddr sPeerAddr;
psClient->GetPeerAddr((SOCKADDR *)&sPeerAddr);
CMainFrame *pMainFrame =(CMainFrame *)AfxGetMainWnd();
CBookServerView *pMainView = (CBookServerView *)(pMainFrame->GetActiveView());
char *szUserName = szBuffer;
char *szPassword = szBuffer + strlen(szUserName) + 1;
CListCtrl & wndListCtrl = pMainView->GetListCtrl();
int nItemCnt = wndListCtrl.GetItemCount();
wndListCtrl.InsertItem(nItemCnt, "NEWUSER");
wndListCtrl.SetItemText(nItemCnt, 0, sPeerAddr.DottedDecimal());
wndListCtrl.SetItemText(nItemCnt, 1, (const char *)ultoa(sPeerAddr.Port(), (char *)szErrMsg, 10));
wndListCtrl.SetItemText(nItemCnt, 2, (const char *)szUserName);
break;
}
case 2 :
{
break;
}
case 3 :
{
break;
}
default:
{
}
}
}
delete []szBuffer;
}
}
catch (CBlockingSocketException* e)
{
//管理Socket
for (SocketVector::iterator itv = g_vClientSocket.begin(); itv != g_vClientSocket.end(); ++itv)
{
if (psClient == *itv)
{
g_vClientSocket.erase(itv);
}
}
//g_vClientSocket
g_nConnection --;
e->GetErrorMessage(szErrMsg, 255);
ErrMsgOutput(szErrMsg);
e->Delete();
}
}
return 0;
}