SOCKET SELECT select会检测不到包吗?如果TCP将包一次性发过来 能正常检测到,如果TCP将包分两次发过来,SELECT有时检测不到包,这是怎么回事? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 应该不会吧,程序逻辑处理有问题吧,用select好久了,没有听说有lz的这种问题哦, DWORD WINAPI CClientSocket::RecvThread(LPVOID lpParameter){ TRACE(_T("接收数据线程启动 \n")); CClientSocket *pClientSocket = (CClientSocket *)lpParameter; TRACE(_T("SOCKET Handle:%d in Thread \n"),pClientSocket->m_hClientSocket); int nRet = connect(pClientSocket->m_hClientSocket,(sockaddr *)&(pClientSocket->m_SAI),sizeof(sockaddr)); if (nRet == SOCKET_ERROR) { pClientSocket->m_strLastError.Format(_T("创建连接socket发生错误,错误信息:%d"),WSAGetLastError()); TRACE( pClientSocket->m_strLastError); TRACE(_T(" in RecvThread \n")); closesocket(pClientSocket->m_hClientSocket); pClientSocket->m_hClientSocket = NULL; PostMessage(pClientSocket->m_hMainWnd,WM_CONNECTMSG,0,0); return -1; } pClientSocket->m_IsSocketConnect = TRUE; PostMessage(pClientSocket->m_hMainWnd,WM_CONNECTMSG,1,0); TRACE(_T("服务器连接成功 \n")); pClientSocket->m_nConnectionCount = 0; TRACE(_T("连接成功据,设置为0 \n")); if (!pClientSocket->SendRegistration()) return -1; while (pClientSocket->m_hClientSocket) { TRACE(_T("等待返回的数据 \n")); fd_set RecvFS; FD_ZERO(&RecvFS); FD_SET(pClientSocket->m_hClientSocket,&RecvFS); struct timeval timeout; timeout.tv_sec = WAITTIME; timeout.tv_usec = 0; nRet = select(pClientSocket->m_hClientSocket+1,&RecvFS,NULL,NULL,&timeout); if (nRet == SOCKET_ERROR) //select函数执行错误 { pClientSocket->m_strLastError.Format(_T("监听Socket进行select出错,错误原因:%d"),WSAGetLastError()); break; } else if (nRet == 0) // { TRACE(_T("监听Socket进行select等待超时\n")); pClientSocket->m_strLastError.Format(_T("监听Socket进行select等待超时")); } else { if (FD_ISSET(pClientSocket->m_hClientSocket,&RecvFS)) { nRet = recv(pClientSocket->m_hClientSocket,(char *)pClientSocket->m_pRecvBuffer+pClientSocket->m_nRecvBufferPos,RECVBUFFER_SIZE-pClientSocket->m_nRecvBufferPos,0); if (nRet == SOCKET_ERROR) { if (pClientSocket->m_hClientSocket != NULL) { shutdown(pClientSocket->m_hClientSocket ,SD_BOTH ); closesocket(pClientSocket->m_hClientSocket); pClientSocket->m_hClientSocket = NULL; } pClientSocket->m_nConnectionCount = -1; pClientSocket->m_IsSocketConnect = FALSE; PostMessage(pClientSocket->m_hMainWnd,WM_DISCONNECTMSG,2,0); //客户端异常主动断开 pClientSocket->m_strLastError.Format(_T("通信异常中断,错误代码:%d"),WSAGetLastError()); AfxMessageBox(pClientSocket->m_strLastError); break; } if (nRet==0) { if (pClientSocket->m_hClientSocket != NULL) { shutdown(pClientSocket->m_hClientSocket ,SD_BOTH ); closesocket(pClientSocket->m_hClientSocket); pClientSocket->m_hClientSocket = NULL; } pClientSocket->m_nConnectionCount = -1; pClientSocket->m_IsSocketConnect = FALSE; PostMessage(pClientSocket->m_hMainWnd,WM_DISCONNECTMSG,3,0); //服务器端主动断开 pClientSocket->m_strLastError.Format(_T("服务器端关闭连接")); break; } TRACE(_T("收到数据,设置为0 \n")); pClientSocket->m_nConnectionCount = 0; if ( !pClientSocket->CheckPacket(nRet) ) break; } } } //end-while return 0;} 把png图片加载到背景图png图片的//怎么加? 最后100分了求用GetDIBits和SetDIBits设置某点颜色的方法 请教各位高手:采用PeekMessage解决笨重函数消耗CPU过多时出现了问题!在线等待! 怎样获得当前活动窗口的DC? 实在不明白exit与return的功能区别,请指教! 数据转换 XP 中关机的API函数参数是多少?98中的参数只能注销! 如何知道系统启动一个新的进程,并找到该进程的ID和窗口句柄 vc中字符时间转系统格式时间代码问题 50分 奉上!非IE浏览器的网页元素 怎么获取啊? opengl 光照 和材质的问题。。。 函数递归调用怎么错了
DWORD WINAPI CClientSocket::RecvThread(LPVOID lpParameter)
{
TRACE(_T("接收数据线程启动 \n")); CClientSocket *pClientSocket = (CClientSocket *)lpParameter;
TRACE(_T("SOCKET Handle:%d in Thread \n"),pClientSocket->m_hClientSocket);
int nRet = connect(pClientSocket->m_hClientSocket,(sockaddr *)&(pClientSocket->m_SAI),sizeof(sockaddr));
if (nRet == SOCKET_ERROR)
{
pClientSocket->m_strLastError.Format(_T("创建连接socket发生错误,错误信息:%d"),WSAGetLastError());
TRACE( pClientSocket->m_strLastError);
TRACE(_T(" in RecvThread \n")); closesocket(pClientSocket->m_hClientSocket);
pClientSocket->m_hClientSocket = NULL; PostMessage(pClientSocket->m_hMainWnd,WM_CONNECTMSG,0,0);
return -1;
} pClientSocket->m_IsSocketConnect = TRUE;
PostMessage(pClientSocket->m_hMainWnd,WM_CONNECTMSG,1,0);
TRACE(_T("服务器连接成功 \n"));
pClientSocket->m_nConnectionCount = 0;
TRACE(_T("连接成功据,设置为0 \n")); if (!pClientSocket->SendRegistration())
return -1; while (pClientSocket->m_hClientSocket)
{
TRACE(_T("等待返回的数据 \n")); fd_set RecvFS;
FD_ZERO(&RecvFS);
FD_SET(pClientSocket->m_hClientSocket,&RecvFS);
struct timeval timeout;
timeout.tv_sec = WAITTIME;
timeout.tv_usec = 0;
nRet = select(pClientSocket->m_hClientSocket+1,&RecvFS,NULL,NULL,&timeout);
if (nRet == SOCKET_ERROR) //select函数执行错误
{
pClientSocket->m_strLastError.Format(_T("监听Socket进行select出错,错误原因:%d"),WSAGetLastError());
break;
}
else
if (nRet == 0) //
{
TRACE(_T("监听Socket进行select等待超时\n"));
pClientSocket->m_strLastError.Format(_T("监听Socket进行select等待超时"));
}
else
{
if (FD_ISSET(pClientSocket->m_hClientSocket,&RecvFS))
{
nRet = recv(pClientSocket->m_hClientSocket,(char *)pClientSocket->m_pRecvBuffer+pClientSocket->m_nRecvBufferPos,RECVBUFFER_SIZE-pClientSocket->m_nRecvBufferPos,0);
if (nRet == SOCKET_ERROR)
{
if (pClientSocket->m_hClientSocket != NULL)
{
shutdown(pClientSocket->m_hClientSocket ,SD_BOTH );
closesocket(pClientSocket->m_hClientSocket);
pClientSocket->m_hClientSocket = NULL;
}
pClientSocket->m_nConnectionCount = -1;
pClientSocket->m_IsSocketConnect = FALSE;
PostMessage(pClientSocket->m_hMainWnd,WM_DISCONNECTMSG,2,0); //客户端异常主动断开
pClientSocket->m_strLastError.Format(_T("通信异常中断,错误代码:%d"),WSAGetLastError());
AfxMessageBox(pClientSocket->m_strLastError);
break;
}
if (nRet==0)
{
if (pClientSocket->m_hClientSocket != NULL)
{
shutdown(pClientSocket->m_hClientSocket ,SD_BOTH );
closesocket(pClientSocket->m_hClientSocket);
pClientSocket->m_hClientSocket = NULL;
}
pClientSocket->m_nConnectionCount = -1;
pClientSocket->m_IsSocketConnect = FALSE; PostMessage(pClientSocket->m_hMainWnd,WM_DISCONNECTMSG,3,0); //服务器端主动断开
pClientSocket->m_strLastError.Format(_T("服务器端关闭连接"));
break;
}
TRACE(_T("收到数据,设置为0 \n"));
pClientSocket->m_nConnectionCount = 0;
if ( !pClientSocket->CheckPacket(nRet) )
break;
}
}
} //end-while return 0;
}