VC SOCKET 多线程

wangzelu1988 wangzelu1988 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
我在调试一个TCP服务器,用的是多线程方法,每一个线程负责处理一个SOCKET来的数据,并且处理方式是一样的,但在调试时发现,线程之间相互干扰,例如,第一个SOCKET来的数据,本来应该进入第一个线程处理,但是它实际进入的是第二个线程。下面的是我写的程序,请帮忙看看。

//每来一个连接就开启一个线程
void CServerSocket::OnAccept(int nErrorCode)
{
// TODO: 在此添加专用代码和/或调用基类
CServerSocket* m_pNewSocket = new CServerSocket(pMainWnd); //创建新的SOCKET
// BOOL a = 1;
// setsockopt(m_pNewSocket->m_hSocket , IPPROTO_TCP , TCP_NODELAY , (char*)&a , sizeof(a));
((CTCPHelperDlg*)pMainWnd)->m_pServersocket->Accept(*m_pNewSocket);
m_pNewSocket->InitQueue(m_pNewSocket->m_ProcessDataQueue , sizeof(m_pNewSocket->m_ProcessDataQueue));
m_pNewSocket->m_hProcessEvent[END_PROCESS_THREAD_INDEX] = CreateEvent(NULL , FALSE , FALSE , _T("EndProcessData"));
m_pNewSocket->m_hProcessEvent[START_PROCESS_THREAD_INDEX] = CreateEvent(NULL , FALSE , FALSE , _T("StartProcessData"));
AfxBeginThread(ProcessDataThread , m_pNewSocke); //开启线程
m_pNewSocket->m_hProcessThread = CreateEvent(NULL , FALSE , FALSE , NULL); //判断线程关闭的HANDLE
((CTCPHelperDlg*)pMainWnd)->SendMessage(WM_TCP_ACCPET , (WPARAM)m_pNewSocket , 0);
CAsyncSocket::OnAccept(nErrorCode);
}

void CServerSocket::OnReceive(int nErrorCode)
{
// TODO: 在此添加专用代码和/或调用基类
/* assert(NULL != pMainWnd);*/
if (nErrorCode == 0)
{
RcvLen = this->Receive(RcvBuf , sizeof(RcvBuf)); //接收SOCKET数据
WriteDataToQueue(RcvBuf , RcvLen); //每来一次数据就将数据全部写入队列中
SetEvent(m_hProcessEvent[START_PROCESS_THREAD_INDEX]);//然后置位相应的HANDLE,使其进入对应的线程中处理
//发送接收消息给主线程
POSITION m_SocketPos = ((CTCPHelperDlg*)pMainWnd)->FindSocketFromList(this);
if (m_SocketPos != NULL)
{
((CTCPHelperDlg*)pMainWnd)->SendMessage(WM_TCP_RX, (WPARAM)m_SocketPos , (LPARAM)RcvLen);
}
}
CAsyncSocket::OnReceive(nErrorCode);
}

//这是线程的处理函数
UINT CServerSocket::ProcessDataThread(LPVOID param)
{
CServerSocket* pTmpServerSocket = (CServerSocket*)param;
int WaitIndex;
pTmpServerSocket->m_bProcessThreadAlive = TRUE;
while(1)
{
WaitIndex = WaitForMultipleObjects(2 , pTmpServerSocket->m_hProcessEvent , FALSE , INFINITE);
if (WaitIndex == 0)
{
pTmpServerSocket->m_bProcessThreadAlive = FALSE;
SetEvent(pTmpServerSocket->m_hProcessThread);
return 0;
}
else
{
pTmpServerSocket->ProcessDataFrame(pTmpServerSocket->pMainWnd);
}
}
return 0;
}

请高手帮忙找一下问题,谢谢!
...全文
评论 2
收藏 已收藏
分享
返回顶部
wangzelu1988
C++ 语言 65,214 成员 250,514 内容