c++ socket 问题
来源:百度知道 编辑:UC知道 时间:2024/06/23 13:35:37
程序里我用的是以下的记录方式。
char getData[100000];
DWORD WINAPI CNetClient::ThreadToRead(LPVOID n)
{
CNetClient* pnetClient = (CNetClient*)n;
int rec_size;
while(1)
{
pnetClient->nReceive = recv(pnetClient->serverSocket,pnetClient->getData,sizeof(pnetClient->getData),0);
if( pnetClient->nReceive == SOCKET_ERROR)
{
wsprintf(pnetClient->szError,TEXT("recv failed.Error:%d"),WSAGetLastError ());
closesocket(pnetClient->serverSocket);
break;
}
else if( pnetClient->nReceive == 0)
{
wsprintf(pnetClient->szError,TEXT("Finished receiving data"));
closesocket(pnetClient->serverSocket);
break;
}
else
{
ofstream ofile("netest5.html",ios::app);
ofile<<pnetClient->getData<<endl;
}
pnetClient->nReceive = recv(pnetClient->serverSocket,pnetClient->getData,sizeof(pnetClient->getData),0);
这是有问题的。
因为你是不能保证一次就能收完的,所以应该分步骤,同时要注意缓冲区偏移量的问题。
static const int g_sciMaxRepeatCount = 10;
template < class OurSocket >
inline int NDReceive( OurSocket& socket, LPVOID pBuf, int iLength )
{
int iReceiveLength = 0;
#if defined(DEBUG) || defined(_DEBUG)
int iCount = 0;
#endif
while( iReceiveLength < iLength )
{
int iTmp = recv( socket, ((LPSTR)pBuf)+iReceiveLength, iLength-iReceiveLength, 0 );
if( SOCKET_ERROR == iTmp )
{
if( GetLastError() == WSAEWOULDBLOCK )
{
return iReceiveLength;
}
break; // maybe access!
}
iReceiveLength += iTmp;
#if defined(DEBUG) || defined(_DEBUG)
if( ++iCount > g_sciMaxRepeatCount )
{
//::MessageBox( NULL, "接收网络数据失败","错