----------------------- int k;
k = recv(Client,buf,100,0);
// readn(Client,buf,100);
CFile destFile;
CString m_fname;
FILE* fp=NULL;
m_fname = "chen.txt";
if((fp=fopen(m_fname,"r"))==NULL)
{
destFile.Open(m_fname, CFile::modeCreate|CFile::modeWrite|CFile::typeBinary|CFile::shareDenyNone);
}
else
{
fclose(fp);
destFile.Open(m_fname,CFile::modeWrite | CFile::typeBinary|CFile::shareDenyNone);
} destFile.Open(m_fname, CFile::modeCreate|CFile::modeWrite|CFile::typeBinary|CFile::shareDenyNone);
destFile.Seek(0,CFile::begin);
destFile.Write(buf, 100);
--------------------------------------------------------------
上面就是我程序中的一段了。
(原文不是这样,被我简化了)
我的问题是,为什么接收到的字节不是原原本本的按照次序的写在文件里,而且后来接到的把前面接到的覆盖了。
传送过来的文件,大概有800k,4k一个包传送,可是我的文件始终只有100字节大小。怎么改?
那个地方有错误?
k = recv(Client,buf,100,0);
// readn(Client,buf,100);
CFile destFile;
CString m_fname;
FILE* fp=NULL;
m_fname = "chen.txt";
if((fp=fopen(m_fname,"r"))==NULL)
{
destFile.Open(m_fname, CFile::modeCreate|CFile::modeWrite|CFile::typeBinary|CFile::shareDenyNone);
}
else
{
fclose(fp);
destFile.Open(m_fname,CFile::modeWrite | CFile::typeBinary|CFile::shareDenyNone);
} destFile.Open(m_fname, CFile::modeCreate|CFile::modeWrite|CFile::typeBinary|CFile::shareDenyNone);
destFile.Seek(0,CFile::begin);
destFile.Write(buf, 100);
--------------------------------------------------------------
上面就是我程序中的一段了。
(原文不是这样,被我简化了)
我的问题是,为什么接收到的字节不是原原本本的按照次序的写在文件里,而且后来接到的把前面接到的覆盖了。
传送过来的文件,大概有800k,4k一个包传送,可是我的文件始终只有100字节大小。怎么改?
那个地方有错误?
要放在while外,打开一次即可,何必打开那么多次?destFile.Seek(0,CFile::begin);你每次写入后都把文件指针置到文件头,自然每次都从文件头开始写了,把这段去掉
int k=0;
while(true)
{
k = recv(Client,buf,filelenth,0);
..........
/对接收的数据进行处理
.............
if(k>filelenth) break;
}
---------------------------------
这条语句已经被注销了,我忘了标记了,不行,还是就100个字节。
不知道你是不是先Open然后循环Write?如果循环Open应该每次都是从头开始Write。
GetPosition看看,是不是每次都在文件头?如果不是,就SeekToEnd看看。
你是不是没有循环recv?
int rc;
cnt = 4102;
while(cnt>0)
{
rc=recv(fd,bp,100,0);
j = bp[0];
i = bp[11];
bp+=rc;
cnt = cnt - rc;
if(j == 1||i == 3)
cnt = 0;
}
------------------------------------------------------------------------
这个就是我的循环了。
if((fp=fopen(m_fname,"r"))==NULL)干什么用?
用CFile不就OK?
如果打开m_fname文件失败,说明此文件并不存在,也就是说:这是第一次下载。
return 错误
就可以搞定你的
if((fp=fopen(m_fname,"r"))==NULL)
{
destFile.Open(m_fname, CFile::modeCreate|CFile::modeWrite|CFile::typeBinary|CFile::shareDenyNone);
}
else
{
fclose(fp);
destFile.Open(m_fname,CFile::modeWrite | CFile::typeBinary|CFile::shareDenyNone);
} destFile.Open(m_fname, CFile::modeCreate|CFile::modeWrite|CFile::typeBinary|CFile::shareDenyNone);
PrepareReceiveFile(CString strFileName)
{
if(m_File.m_hFile != NULL)
m_File.Close(); if(!m_File.Open(strFileName, CFile::modeWrite | CFile::modeCreate | CFile::modeNoTruncate | CFile::shareDenyWrite))
return; m_File.SeekToEnd();
}
ReceiveFile函数中根据recv返回值进行switch,将接收到文件内容部分直接写入文件就可以了
//这是接受部分的代码。
int cnt;//用来保存剩余的字节数。
int rc;
cnt = 4102;
while(cnt>0)
{
rc=recv(fd,bp,100,0);
j = bp[0];
i = bp[11];
iii = bp;
bp+=rc;
cnt = cnt - rc;
if(j == 1||i == 3)
cnt = 0;
}
-------------------------------------------------
//这是写入文件部分的代码。
int j = iii.GetLength();
CFile destFile;
CString m_fname;
FILE* fp=NULL;
m_fname = "chen.txt";
if(!destFile.Open(m_fname,CFile::modeCreate|CFile::modeNoTruncate| CFile::modeWrite|CFile::typeBinary|CFile::shareDenyNone))
return;
DWORD dd = destFile.SeekToEnd();
destFile.Write(iii, len0);
---------------------------------------------------------
CFile mFile;
if(!mFile.Open("Test.txt",CFile::modeCreate|CFile::modeNoTruncate| CFile::modeWrite|CFile::typeBinary|CFile::shareDenyNone))
AfxMessageBox("Error!");
for(int iLoop = 0 ; iLoop < 10 ; iLoop ++)
{
mFile.SeekToEnd();
mFile.Write("AAA\n",4);
}
mFile.Close();
没有问题.
再就是你recv之前最好memset(bp,……)
你接受的文件小有可能是你循环提前退出了吧?
你可以先测试你的写文件是否是有什么问题,把recv屏蔽掉,附上一个值,看看能不能正常写入文件。
用二进制打开文件一看全都是CDCDCDCD……郁闷阿,怎么会事?
接受语句我没作循环。
rc=recv(fd,bp,100,0);
那你
while(cnt>0)
{
rc=recv(fd,bp,100,0);
j = bp[0];
i = bp[11];
iii = bp;
bp+=rc;
cnt = cnt - rc;
if(j == 1||i == 3)
cnt = 0;
}
什么意思?
recv乱码是不是跟你send的数据有关系?
我怎么才能把这个数读出来?
sscanf(……,"%x",……)