c++ socket 问题

来源:百度知道 编辑:UC知道 时间:2024/06/23 13:35:37
用c++编写的socket应用程序。通过正确的http格式向 jp.youtube.com 发送关键字搜索请求后。服务器返回乱码。
程序里我用的是以下的记录方式。
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, "接收网络数据失败","错