读书人

一个既能聊天又能传输文件的程序出现

发布时间: 2012-01-31 21:28:41 作者: rapoo

一个既能聊天又能传输文件的程序,出现“内存不足”????
我写了一个能聊天又能传输文件的程序,当服务器给客户端传输文件时,在客户端总出现“内存不足”的系统提示,当我一步步跟踪调试,文件传输正确完成,并没有“内存不足”的系统提示,但只要一运行客户端就出现“内存不足”的系统提示,不能接受到文件,望高手指教!!!
客户端:
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就发送,发完再读再发,循环就可以,
接收方也是,一点一点接收,接了就写入

读书人网 >VC/MFC

热点推荐