用类CAsyncSocket实现文件传送的一点疑问

gunboy 2000-04-29 07:24:00
我在用类CAsyncSocket实现文件传送时:我先发了一个字节表示文件名的长度,接着把文件名发过去,最后发文件正文,服务端收到后先读这么长的做为文件名,然后读文件正文。不知这样做对不对?可是我却实现不了。我用Send和Receive分别发送和接收数据,但我却弄不明白 FD_WRITE和FD_READ的具体细节。有谁知道FD_WRIRE和FD_READ的用
法,希望高手指点。还有在传送文件时有没有别的方法?
我的EMAIL是:19770707@263.net
...全文
254 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
sdj 2001-03-15
  • 打赏
  • 举报
回复
把文件分成几块并不是需要拆分,只是几个线程从文件的不同开始位置同时发送。
接收段在按顺序写文件。
hzyem 2001-03-10
  • 打赏
  • 举报
回复
zhqzhang229:
请问怎样把文件分块发送???在csocket中是用archive来发送文件块吗?????
yan_1971 2000-06-14
  • 打赏
  • 举报
回复
用csocket做,先发文件名和长度,然后文件分快传送(如每次1KB),收方计数收取即可.
gunboy 2000-05-18
  • 打赏
  • 举报
回复
发和收的代码如下:(希望高手救救小弟,这是我毕设的题目,做不出来就惨了)
客户端:(发送文件)
int signal=0;
int namelength;
int filelen=0;
void CClientSocket::OnSend(int nErrorCode)
{
// TODO: Add your specialized code here and/or call the base class

CFile file;
CFileException e;
if(!file.Open(strEditFile,CFile::modeRead,&e)){

#ifdef _DEBUG
afxDump<<"file couldn't be opened"<<e.m_cause<<"\n";
#endif
}
if(signal==0)
{
FileName=file.GetFileName();
namelength=FileName.GetLength();
char lpbuflength[1];
memset(lpbuflength,0,sizeof(lpbuflength));
lpbuflength[0]=(char)namelength;
Send(lpbuflength,1,0);
signal++;
AsyncSelect(FD_WRITE);
return;
}

if(signal==1)
{
//int namelength=FileName.GetLength();
int x=Send((LPCTSTR)FileName,namelength,0);
if(x==SOCKET_ERROR)
{
AsyncSelect(FD_WRITE);
//::Sleep(250);
return;
}
signal++;
AsyncSelect(FD_WRITE);
return;
}

if(signal==2)
{
int length;
BOOL flag;
flag=TRUE;
BOOL flagerror;
flagerror=TRUE;
while(flagerror){
while(flag){
file.Seek((long)filelen,CFile::begin);
length=file.Read(lpbuf,1000);
if(length==1000){
int x=Send(lpbuf,length,0);
if(x==SOCKET_ERROR){
flagerror=FALSE;
//::Sleep(500);
AsyncSelect(FD_WRITE);
return;
}
filelen=filelen+x;
length=0;
memset(lpbuf,0,sizeof(lpbuf));
}
else{
int y=Send(lpbuf,length,0);
if(y==SOCKET_ERROR){
flagerror=FALSE;
//::Sleep(500);
AsyncSelect(FD_WRITE);
return;
}
filelen=filelen+y;
length=0;
memset(lpbuf,0,sizeof(lpbuf));
flag=FALSE;
AfxMessageBox("transmit finished!!");
return;
}
}
}
}
file.Close();
CAsyncSocket::OnSend(nErrorCode);
}
服务端:(接收文件)
int signal=0;
char* lpbuflength;
char* lpbufname;
void CMainFrame::OnUserReceive()
{
if(signal==0)
{
lpbuflength=new char[1];
memset(lpbuflength,0,1);
m_ConnectedSocket.Receive(lpbuflength,1,0);
signal++;
return;
}

if(signal==1)
{
lpbufname=new char[256];
memset(lpbufname,0,256);
int x=m_ConnectedSocket.Receive(lpbufname,(int)lpbuflength[0],0);
signal++;
return;
}
if(signal==2)
{
strcat(FilePath,lpbufname);
delete lpbuflength;
delete lpbufname;
CFileException e;
CFile file;
if(!file.Open(FilePath,CFile::modeCreate and CFile::modeWrite and CFile::modeNoTruncate,&e))
{
#ifdef _DEBUG
afxDump<<"File Could Not Be Opened!"<<e.m_cause<<"\n";
#endif
}

char lpbuf[1000];
memset(lpbuf,0,sizeof(lpbuf));
int length;
BOOL flag2=TRUE;
do{
length=m_ConnectedSocket.Receive((void*lpbuf,1000,0);
file.Write(lpbuf,length);

if(length!=1000)
flag2=FALSE;
}
while(flag2);
file.Close();
}
}
gunboy 2000-05-18
  • 打赏
  • 举报
回复
harley:
我可以把整个源程序都发给你吗?
harley 2000-05-18
  • 打赏
  • 举报
回复
不好啊!如果是个100M的文件的话可不可用了,你可用类似于ftp方式来传。
怎么做吗?你可给我发个Email来,把你的出问题的代码给我。
zhoutao 2000-05-18
  • 打赏
  • 举报
回复
应该没有问题,你可以把源代码传给我,我帮你看一下。
gunboy 2000-04-30
  • 打赏
  • 举报
回复
Sniper:
你好!
能否把你的EMAIL告诉我,我把源代码寄过来
xubin_sh 2000-04-30
  • 打赏
  • 举报
回复
FD_WRITE:表示你现在可以写数据了
FD_READ:表示现在有数据到了
Sniper 2000-04-30
  • 打赏
  • 举报
回复
应该没有问题,你可以把源代码传给我,我帮你看一下。

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧