18,356
社区成员
发帖
与我相关
我的任务
分享
//服务器发送线程
DWORD WINAPI CClient::SendThread(void *pParam)
{
CClient *pClient=(CClient *)pParam;
while(pClient->m_isConnected)
{
if(WAIT_OBJECT_0==WaitForSingleObject(pClient->m_hSendEvent,INFINITE)) //等待发送事件
{
if(!pClient->m_isConnected) //如果连接断开
{
pClient->m_isConnected=false;
break;
}
int retval=send(pClient->m_socket,pClient->m_sendData.buf,((pHdr)pClient->m_sendData.buf)->len,0);
if(retval==SOCKET_ERROR) //发送失败
{
int ErrCode=WSAGetLastError();
if(ErrCode==WSAEWOULDBLOCK)
continue;
else if(ErrCode==WSAENETDOWN || ErrCode==WSAECONNRESET || ErrCode==WSAETIMEDOUT)
{
pClient->m_isConnected=false;
pClient->m_isExit=true;
break;
}
}
ResetEvent(pClient->m_hSendEvent); //重置发送事件
}
}
return 0;
}
//客户端接收线程
DWORD WINAPI RecvThread(void *pParam)
{
char temp[MAX_BUF_SIZE]; //临时接收缓冲区
memset(temp,0,MAX_BUF_SIZE);
int ival;
while(g_isConnected)
{
ival=recv(g_sClient,temp,MAX_BUF_SIZE,0);
if(ival==SOCKET_ERROR) //接收失败
{
int ErrCode=WSAGetLastError();
if(ErrCode==WSAEWOULDBLOCK)
{
Sleep(500);
continue;
}
else
{
g_isConnected=false;
SetEvent(g_hShowResultEvent);
break;
}
}
else if(ival==0) //连接关闭
{
g_isConnected=false;
SetEvent(g_hShowResultEvent);
break;
}
else if(ival>HEADERLEN) //接收成功
{
//将接收到的数据解包并拷贝到全局的接收缓冲区中
pHdr pHeader=(pHdr)temp;
memset(g_RecvBuf.buf,0,MAX_BUF_SIZE);
memcpy(g_RecvBuf.buf,temp+HEADERLEN,pHeader->len-HEADERLEN);
SetEvent(g_hShowResultEvent); //通知显示计算结果
}
memset(temp,0,MAX_BUF_SIZE);
Sleep(500);
}
SetEvent(g_hSendEvent); //线程退出时设置发送事件为有信号状态,以防发送线程一直等待
return 0;
}