18,356
社区成员
发帖
与我相关
我的任务
分享
if(WSAAsyncSelect(m_sockClient,m_hWnd,NETWORK_EVENT,FD_CLOSE | FD_READ | FD_CONNECT) == SOCKET_ERROR)
{
closesocket(m_sockClient);
//MessageBox("CComWnd注册网络异步事件失败!");
//WSACleanup();
return 0;
}
//...省略
void CInstrumentStatusView::OnNetEvent(WPARAM wParam, LPARAM lParam) {
int iEvent = WSAGETSELECTEVENT(lParam);
int error = WSAGETSELECTERROR(lParam); //if error!=0, it means failure
SOCKET CurSock= (SOCKET)wParam;
switch(iEvent){
case FD_READ:
OnSockReceive();
//...省略
}
}
void CInstrumentStatusView::OnSockReceive(){
int ReadResults=0;
ReadResults=recv(m_sockClient,(char*)m_ReadBuffer,5036,0);
if(ReadResults==m_pCurCommand->m_nExpectedBytes){ //接收字节数ReadResults=4017的情况
m_pCurCommand->m_bCommandExcuted=TRUE; //Will remove CurrCommand at next OnTimer()
int i=0;
while(!Ready) {
if(m_pCurCommand->AddToReceiveBuffer(*(m_ReadBuffer+i))) {
Ready=TRUE;
}
i++;
}
}
else{ //接收字节数ReadResults !=4017的情况
//not recv completely,
m_pCurCommand->m_bCommandExcuted=TRUE;
m_pCurCommand->m_status=OverTime;
m_comInstrument.m_bComError=TRUE;
}
}
WSAAsyncSelect(m_sockClient,m_hWnd,NETWORK_EVENT,0); //关闭READ事件,这样关闭是否妥当?
//多次执行recv()
WSAAsyncSelect(m_sockClient,m_hWnd,NETWORK_EVENT,FD_READ);//重新注册READ事件,这样恢复是否妥当?
while ( nTotalLen != nDataLen )
{
char cRecv;
nReadLen = recv(m_s, &cRecv, 1,0); //每次接收1个字符
if (SOCKET_ERROR == nReadLen) //网络错误
{
if (WSAEWOULDBLOCK == WSAGetLastError())
{
continue;
}
else break; //出现SOCKET_ERROR,但不是WSAEWOULDBLOCK ,那么break掉此次循环
reVal = FALSE;
}else if (0 == nReadLen)
{
AfxMessageBox(_T("客户端关闭了连接!"));
reVal = FALSE;
}else if (nReadLen > 0)
{
if ('<' == cRecv) //开始字符
{
strUserInfo.Empty();
}else if ('>' == cRecv) //结束字符
{
break;
}else
{
strUserInfo += cRecv; //添加字符
}
nTotalLen += nReadLen;
}
}
void CInstrumentStatusView::OnSockReceive(){
int ReadResults;
int total=0;
while( total != 4107 ){
ReadResults=recv(m_sockClient,(char*)m_ReadBuffer,5036,0);
totol+=intReadResults;
//拼接处理
}
while ( nTotalLen != nDataLen )
{
char cRecv; //接收字符
nReadLen = recv(m_s, &cRecv, Number,0); //每次接收Number个字符
if (SOCKET_ERROR == nReadLen) //网络错误
{
//表示接收没有结束 还有数据 要你继续去接收
if (WSAEWOULDBLOCK == WSAGetLastError())
{
continue;
}
reVal = FALSE;
}else if (0 == nReadLen)
{
AfxMessageBox(_T("客户端关闭了连接!"));
reVal = FALSE;
}else if (nReadLen > 0)
{
if ('<' == cRecv) //开始字符
{
strUserInfo.Empty();
}else if ('>' == cRecv) //结束字符
{
break;
}else
{
strUserInfo += cRecv; //添加字符
}
nTotalLen += nReadLen;
}
}
WSAAsyncSelect(m_sockClient,m_hWnd,NETWORK_EVENT,0); //关闭FD_READ事件
while(total<4107){
ReadResults=recv(m_sockClient,((char*)m_ReadBuffer)+total,5036-total,0);
total+=ReadResults;
char dbg[30];
int error=WSAGetLastError();// 打印错误信息
sprintf(dbg,"error=%d",error);
OutputDebugString(dbg);
}
WSAAsyncSelect(m_sockClient,m_hWnd,NETWORK_EVENT,FD_READ);//读完了,恢复FD_READ