传文件完了后怎么通知接受方?

geyufly 2005-09-16 12:36:12
在传文件时,我想等文件传完后发送个“end”字符信息给接受方以通知接受方文件传送完成,可是我怎么区分收到的文件信息还是end着个字符串信息哪?我的代码如下请大家帮哈忙哦
发送方:
CFile file(m_strFilePathName, CFile::modeRead|CFile::typeBinary);
SOCKET_STREAM_FILE_INFO FileInfo;

//初始化文件信息
strcpy(FileInfo.szFileTitle, file.GetFileName());
FileInfo.nFileSize = file.GetLength();

m_sConnectSocket.Send(&FileInfo, sizeof(SOCKET_STREAM_FILE_INFO));

BYTE * pBuffer = new BYTE[1024];
int nFileLen = file.GetLength();
int nSentLen = 0;

CString str;
int nLen;
do {
try
{
nLen = file.Read(pBuffer, 1024);
}
catch (CFileException * e)
{
e->ReportError();
}

m_sConnectSocket.Send(pBuffer, 1024);
nSentLen += nLen;

str.Format(_T("%d"), nSentLen*100/nFileLen);
SetWindowText(_T("Sending.....") + str + _T("%"));
} while(nSentLen < nFileLen);

CString temp="end";
m_sConnectSocket.Send(&temp,temp.GetLength());
AfxMessageBox("Send Finish");
file.Close();
AfxMessageBox("Send Success");
delete pBuffer;

接收方:
if (收到的是结束字符end){
FileOpen=false;
file.close();
AfxMessageBox("recive success");
}
if (!FileOpen){
CFileDialog FileDlg(FALSE, NULL, NULL, OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"All File(*.*)|*.*|");

if (FileDlg.DoModal() == IDCANCEL)
return;

m_strFilePathName = FileDlg.GetPathName();
file.Close();
if (file.Open(m_strFilePathName, CFile::modeCreate | CFile::modeWrite | CFile::typeBinary)==false){
AfxMessageBox("File Cann't Open");
file.Close();
}

m_sConnectSocket.Receive(&FileInfo, sizeof(SOCKET_STREAM_FILE_INFO)); //Now we get the File Size first
FileOpen=true;
}
BYTE * pBuffer = new BYTE[1024];
int nFileLen = FileInfo.nFileSize;
int nRecvLen = 0;

CString str;
int nLen;
nLen=m_sConnectSocket.Receive(pBuffer, 1024);
try
{
file.Write(pBuffer, nLen);
}
catch (CFileException * e)
{
e->ReportError();
}

nRecvLen += nLen;

str.Format(_T("%d"), nRecvLen*100/nFileLen);
SetWindowText(_T("Sending.....") + str + _T("%"));
各位大哥帮我看下有哪不妥,该怎么修改,要简单点的方法啊,不要太复杂的用什么线程什么的小弟看不懂哈
...全文
164 点赞 收藏 16
写回复
16 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
geyufly 2005-09-17
怎么没有人理我啊
回复
i_noname 2005-09-16
参考
http://www.codeproject.com/internet/SocketFileTransfer.asp
回复
geyufly 2005-09-16
还有我上面的代码发现传送文件时也有问题哈,传过去都是错的,请大家一定帮我啊救救我了
回复
i_noname 2005-09-16
在文件正式传送之前发送一个文件长度给接收方,这样接收方就可以知道文件是否结束了。

fileLength = sourceFile.GetLength();
fileLength = htonl( fileLength );

cbLeftToSend = sizeof( fileLength );

do
{
int cbBytesSent;
BYTE* bp = (BYTE*)(&fileLength) + sizeof(fileLength) - cbLeftToSend;
cbBytesSent = sockConnection.Send( bp, cbLeftToSend );

// test for errors and get out if they occurred
if ( cbBytesSent == SOCKET_ERROR )
{
//...
}

// data was successfully sent, so account for it with already-sent data
cbLeftToSend -= cbBytesSent;
}
while ( cbLeftToSend>0 );


// now send the file's data

sendData = new BYTE[SEND_BUFFER_SIZE];

cbLeftToSend = sourceFile.GetLength();

do
{
// read next chunk of SEND_BUFFER_SIZE bytes from file

int sendThisTime, doneSoFar, buffOffset;

sendThisTime = sourceFile.Read( sendData, SEND_BUFFER_SIZE );
buffOffset = 0;

do
{
doneSoFar = sockConnection.Send( sendData + buffOffset, sendThisTime );

// test for errors and get out if they occurred
if ( doneSoFar == SOCKET_ERROR )
{
//...
}

// data was successfully sent, so account for it with already-sent data

buffOffset += doneSoFar;
sendThisTime -= doneSoFar;
cbLeftToSend -= doneSoFar;
}
while ( sendThisTime > 0 );

}while ( cbLeftToSend > 0 );
回复
softrain 2005-09-16
接收端每次请求文件的一个部分,计算自己接收了多少,这样发送端就传送指定部分。当文件传输完成,接收端自己就知道了,不用再请求即可。或者发送一个消息,让发送端关闭文件。
回复
rageliu 2005-09-16
都定义了结束字符!
怎么会不知道结尾??
是没传输或接收对吧?
回复
geyufly 2005-09-16
这是c下面的代码吗,vc里面的应该怎么弄啊?
回复
MuseIn 2005-09-16
分多次传输:
#define READ_WRITE_BUF 256
if( (fh = fopen( file_name,"rb" ))==NULL )
{
printf("open file faild,file name: %s",file_name);
return FILE_NOT_EXIST;
}
memset( temp,0,READ_WRITE_BUF*sizeof(char) );
nLength=fread( temp,sizeof(char),READ_WRITE_BUF*sizeof(char),fh );
while( nLength )
{
send(cli_fd,temp,nLength,0);
memset( temp,0,READ_WRITE_BUF*sizeof(char) );
nLength=fread( temp,sizeof(char),READ_WRITE_BUF*sizeof(char),fh );
}
fclose(fh);
fh=NULL;
回复
geyufly 2005-09-16
我现在文件是在100k以上就传不起了,请大家帮哈忙哦
回复
football 2005-09-16
传输文件前,先发送文件的大小(DWORD型或则是ULONGLONG型,通信的协议是自己定义的。)。

再接下来传输文件,接收端接受完毕后,可以发回一个接收是否成功的消息。




回复
syl2000 2005-09-16
对,真正能够在网络上比较安全的传送的Buffer的大小,需要根据网络的具体情况而定,比如,你的应用程序就是在内网上运行的,传输质量很高,那么可以把缓冲区设得大一些,相反的话,就设的小一些!总之需要自己的程序写完后,先试验一下,然后再发布,这样才够稳妥哦!
回复
i_noname 2005-09-16
send不能保证真正发送的字节数,真正发送出去的字节数写在返回值中。
回复
geyufly 2005-09-16
那么请问在发送函数send中
sockConnection.Send( sendData + buffOffset,sendThisTime );
是否一次就能传完sendtistime这么大小的数据?
回复
syl2000 2005-09-16
如果文件太大,最好把文件分块!每次传送的时候,自己定义数据结构,比如,每次传送的数据结构定义为:
data struct{
int BufIdx; //当前块编号
int TotBuf; //总共的分块数
int BufLen; //当前块长度
byte Buffer[10240];} //当前块字节内容
这样在接收端就可以知道所传送的数据是哪一块的,就可以完成文件的还原了!
回复
feelmoon 2005-09-16
好简解决的,先发个信令告诉对方你发的文件多长,然后对方可以根据文件长度判断也可以根据sock是否存在判断你是否传完,当然,你在传完最后1个buff后要close掉你的socket
回复
发帖
网络编程
创建于2007-09-28

1.8w+

社区成员

VC/MFC 网络编程
申请成为版主
帖子事件
创建了帖子
2005-09-16 12:36
社区公告
暂无公告