首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

一个既能聊天又能传输文件的程序,出现“内存不足”?解决思路

2012-01-31 
一个既能聊天又能传输文件的程序,出现“内存不足”????我写了一个能聊天又能传输文件的程序,当服务器给客户

一个既能聊天又能传输文件的程序,出现“内存不足”????
我写了一个能聊天又能传输文件的程序,当服务器给客户端传输文件时,在客户端总出现“内存不足”的系统提示,当我一步步跟踪调试,文件传输正确完成,并没有“内存不足”的系统提示,但只要一运行客户端就出现“内存不足”的系统提示,不能接受到文件,望高手指教!!!
客户端:
CDataSocket继承于CAsyncSocket,定义CDataSocket   m_ClientSocket;
void   CDataSocket::OnReceive(int   nErrorCode)  
{
char   tag[1];
this-> Receive(tag,sizeof(tag),0);
CString   str;
if(tag[0]== '@ ')     //聊天
{
m_pDlg-> Receive();
}
else   if(tag[0]== '# ')     //传文件
{
m_pDlg-> ReceiveFile();
}
else   return;
CAsyncSocket::OnReceive(nErrorCode);
}

void   CTalkDlg::ReceiveFile()
{
GetFile(&m_ClientSocket);
}

void   GetFile(CDataSocket   *pSocket)
{
long   FileLength;
char   *data;
//char   data[ReadSize];
char   fn[40];
int   test=1;

pSocket-> Receive(&FileLength,4);
pSocket-> Receive(fn,40);

data=new   char[FileLength+1];
//assert(test!=1);

pSocket-> Receive(data,FileLength);

data[FileLength]= '\0 ';

if(IDYES==AfxMessageBox( "是否接受文件? ",MB_YESNO))
{
CFileDialog   fd(false,   NULL,fn,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,NULL,NULL);
if(IDOK==fd.DoModal())
{
CString   filePath=fd.GetPathName();
CFile   file;
file.Open(filePath,CFile::modeCreate|CFile::modeWrite   |   CFile::typeBinary);
file.WriteHuge(data,FileLength+1);
file.Close();
}
}else   return;

delete   []   data;
}

服务器:

void   CInfoDlgBar::OnSendFile()  
{
SendFile((m_pFrame-> m_currentInfo)-> pSocket);   //其中参数为客户端socket

}


void   SendFile(CDataSocket   *   pSocket)
{
CFileDialog   fd(true);
CString   filename;
char   fn[40];

CFile   file;
int   FileLength;
char   *data;

if(IDOK==fd.DoModal())
{
filename=fd.GetFileName();
if(!file.Open(filename.GetBuffer(0),CFile::modeRead   |   CFile::typeBinary))
{
AfxMessageBox( "打开文件失败,取消发送! ");
return;
}
strcpy(fn,filename.GetBuffer(0));
}
else   return;

char   tag[1]={ '# '};
pSocket-> Send(tag,sizeof(tag),0);

FileLength=file.GetLength();
pSocket-> Send(&FileLength,4);     //文件长度
pSocket-> Send(fn,40);     //文件名字

data=new   char[FileLength];

//memset(data,0,sizeof(data));
file.ReadHuge(data,FileLength);
pSocket-> Send(data,FileLength);

delete   []   data;
file.Close();

}


[解决办法]
你发送文件是 new一个文件大小的空间
接收文件是 new一个文件大小的空间
这样的做法有问题吧,如果文件有几百兆,那不是要new那个大的空间
[解决办法]
用到new就要控制好,没有控制好,就出现你现在的现象,内存没有释放
直接外面定义一个BUF,不就得了,省得每次NEW
[解决办法]
用一个几kb的区域变量,然后读几kb就发送,发完再读再发,循环就可以,
接收方也是,一点一点接收,接了就写入

热点排行