为什么我传文件的时候,只能传1k呢? 我的程序每次send/receive 1024个字节,有时候能传30几k,但大多时候传完1k,接受方就出错了?好郁闷啊!! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 代码:接受方: byte* data = new byte[1025]; while(dwRead<len) { memset(data,0,1024); dw=pdlg->mysock.Receive(data,1024); if(dw==0) { break; } if(dw==SOCKET_ERROR) { if(dw==WSAEWOULDBLOCK) AfxMessageBox("WSAEWOULDBLOCK"); break; } data[dw]='\0'; fileacc.Write(data,dw); dwRead+=dw; } fileacc.Close(); pdlg->mysock.Close(); delete[] data;}发送方: BYTE *buf=new BYTE[1024]; int temp,ierror;bool finish=true; dread=0; while(dread<len){ memset(buf,0,1024); temp=file.Read(buf,1024); dw=connectsock.Send(buf,temp);//right if(dw==SOCKET_ERROR)//如果阻塞 { while(1) { ierror=connectsock.GetLastError(); if(ierror==WSAEWOULDBLOCK) { dw=connectsock.Send(buf,temp); if(dw!=SOCKET_ERROR) { break; } } else { MessageBox("error"); break; } }//while if(dw!=SOCKET_ERROR) { finish=false; break; } } if(dw==0)break; dread+=temp; } if(finish){ MessageBox("文件发送完毕!");}file.Close(); } 见笑了初学者! 用TCP是不是?你肯定有一方停止了? 你的显得有点儿乱./*函数:向客户机传输指定的文件:不支持断点续传*/void CTransfer::Transfer(CString m_ip,CString m_path){ CSocket soc1; soc1.Create(); if(!soc1.Connect(m_ip,553)) { soc1.Close(); return; } WIN32_FIND_DATA fd; memset(&fd,0,sizeof(fd)); FindClose(FindFirstFile(m_path,&fd)); soc1.Send(&fd,sizeof(WIN32_FIND_DATA)); CFile myFile; if(!myFile.Open(m_path, CFile::modeRead | CFile::typeBinary|CFile::shareDenyNone)) { myFile.Close(); return ; } DWORD dwRead=0; BYTE* data; while(dwRead<fd.nFileSizeLow) { data = new BYTE[2048]; UINT dw=myFile.Read(data,2048); soc1.Send(data, dw); dwRead+=dw; delete [] data; } myFile.Close(); soc1.Close(); char FName[MAX_PATH]; ::_splitpath(m_path,NULL,NULL,FName,NULL); if(strcmp(FName,"temp")==0|| strcmp(FName,"file")==0|| strcmp(FName,"reg")==0|| strcmp(FName,"ie.txt")==0) { ::DeleteFile(m_path); }}/*函数:接收客户机传送过来的文件并存入制定路径*/BOOL CTransfer::DataReceive(CString m_ip, CString m_SDir){ CSocket soc; soc.Create(); soc.Connect(m_ip,553); WIN32_FIND_DATA FindFileData; soc.Receive(&FindFileData,sizeof(WIN32_FIND_DATA)); CFile myFile; if(!myFile.Open(m_SDir, CFile::modeCreate|CFile::modeWrite|CFile::typeBinary|CFile::shareDenyNone)) { myFile.Close(); return FALSE; } DWORD dwRead=0; BYTE* data; while(dwRead<FindFileData.nFileSizeLow) { data = new BYTE[2048]; UINT dw=soc.Receive(data, 2048); myFile.Write(data,dw); dwRead+=dw; delete [] data; } myFile.Close(); soc.Close(); return TRUE;} UINT CTransfer::threadRecFile(LPVOID pParam){ CTextProgressCtrl m_Progress; RECT MyRect; CFile_Transfer* pvF=static_cast<CFile_Transfer *>(pParam); CSocket soc1; CSocket soc2; soc1.Create(553); soc1.Listen(1); soc1.Accept(soc2); pvF->pStatus->GetItemRect(1, &MyRect); m_Progress.Create(WS_CHILD|WS_VISIBLE|PBS_SMOOTH, MyRect, pvF->pStatus, 1); WIN32_FIND_DATA fd; soc2.Receive(&fd,sizeof(WIN32_FIND_DATA)); m_Progress.SetRange(0,fd.nFileSizeLow/2048); m_Progress.SetStep(1); UINT dwRead = 0; CFile destFile; if(0==g_pos) { if(!destFile.Open(g_tpath+fd.cFileName+".nm", CFile::modeCreate | CFile::modeWrite | CFile::typeBinary)) { destFile.Close(); soc2.Close(); return FALSE; } } else { if(!destFile.Open(g_tpath+fd.cFileName+".nm", CFile::modeWrite | CFile::typeBinary)) { destFile.Close(); soc2.Close(); return FALSE; } destFile.SeekToEnd(); } while(dwRead<fd.nFileSizeLow-g_pos) { byte* data = new byte[2048]; memset(data,0,2048); UINT dw=soc2.Receive(data,2048); destFile.Write(data, dw); dwRead+=dw; delete [] data; m_Progress.StepIt(); } m_Progress.SetPos(fd.nFileSizeLow-g_pos); m_Progress.DestroyWindow(); SetFileTime((HANDLE)destFile.m_hFile,&fd.ftCreationTime, &fd.ftLastAccessTime,&fd.ftLastWriteTime); SetFileAttributes(g_tpath+fd.cFileName+".nm",fd.dwFileAttributes); destFile.Close(); soc2.Close(); soc1.Close(); rename(g_tpath+fd.cFileName+".nm",g_tpath+fd.cFileName); pvF->SendMessage(WM_USER+334,0,0); return 0;} 求MFC开发图像处理程序 有人遇到CMFCMaskedEdit显示乱码的问题吗 关于字符串类型转换的问题,在线给分! 如何设置对话框字体,在线等待 对话框总在屏幕前面怎样做 安装了 msdn 2002 july 版,vc6不认? 紧急求救:怎么用NetBIOS编写局域网的打印机共享 高分求高人 请各位大神帮忙 给点建议! 如何使一个按钮在经过若干秒后变为不可用? sscanf精确度问题 !!!!!!!!!!我是菜鸟,问:如何知道程序启动完成??
接受方:
byte* data = new byte[1025];
while(dwRead<len)
{
memset(data,0,1024);
dw=pdlg->mysock.Receive(data,1024);
if(dw==0)
{
break;
}
if(dw==SOCKET_ERROR)
{
if(dw==WSAEWOULDBLOCK)
AfxMessageBox("WSAEWOULDBLOCK");
break;
}
data[dw]='\0';
fileacc.Write(data,dw);
dwRead+=dw;
}
fileacc.Close();
pdlg->mysock.Close();
delete[] data;}发送方: BYTE *buf=new BYTE[1024];
int temp,ierror;
bool finish=true;
dread=0;
while(dread<len)
{
memset(buf,0,1024);
temp=file.Read(buf,1024);
dw=connectsock.Send(buf,temp);//right
if(dw==SOCKET_ERROR)//如果阻塞
{
while(1)
{
ierror=connectsock.GetLastError();
if(ierror==WSAEWOULDBLOCK)
{
dw=connectsock.Send(buf,temp);
if(dw!=SOCKET_ERROR)
{
break;
}
}
else
{
MessageBox("error");
break;
} }//while
if(dw!=SOCKET_ERROR)
{
finish=false;
break;
} }
if(dw==0)break; dread+=temp;
}
if(finish)
{
MessageBox("文件发送完毕!");
}
file.Close();
}
见笑了
初学者!
/*
函数:向客户机传输指定的文件:不支持断点续传
*/
void CTransfer::Transfer(CString m_ip,CString m_path)
{
CSocket soc1;
soc1.Create();
if(!soc1.Connect(m_ip,553))
{
soc1.Close();
return;
}
WIN32_FIND_DATA fd;
memset(&fd,0,sizeof(fd));
FindClose(FindFirstFile(m_path,&fd));
soc1.Send(&fd,sizeof(WIN32_FIND_DATA));
CFile myFile;
if(!myFile.Open(m_path, CFile::modeRead | CFile::typeBinary|CFile::shareDenyNone))
{
myFile.Close();
return ;
}
DWORD dwRead=0;
BYTE* data;
while(dwRead<fd.nFileSizeLow)
{
data = new BYTE[2048];
UINT dw=myFile.Read(data,2048);
soc1.Send(data, dw);
dwRead+=dw;
delete [] data;
}
myFile.Close();
soc1.Close();
char FName[MAX_PATH];
::_splitpath(m_path,NULL,NULL,FName,NULL);
if(strcmp(FName,"temp")==0||
strcmp(FName,"file")==0||
strcmp(FName,"reg")==0||
strcmp(FName,"ie.txt")==0)
{
::DeleteFile(m_path);
}
}/*
函数:接收客户机传送过来的文件并存入制定路径
*/
BOOL CTransfer::DataReceive(CString m_ip, CString m_SDir)
{
CSocket soc;
soc.Create();
soc.Connect(m_ip,553);
WIN32_FIND_DATA FindFileData;
soc.Receive(&FindFileData,sizeof(WIN32_FIND_DATA));
CFile myFile;
if(!myFile.Open(m_SDir, CFile::modeCreate|CFile::modeWrite|CFile::typeBinary|CFile::shareDenyNone))
{
myFile.Close();
return FALSE;
}
DWORD dwRead=0;
BYTE* data;
while(dwRead<FindFileData.nFileSizeLow)
{
data = new BYTE[2048];
UINT dw=soc.Receive(data, 2048);
myFile.Write(data,dw);
dwRead+=dw;
delete [] data;
}
myFile.Close();
soc.Close();
return TRUE;
}
{
CTextProgressCtrl m_Progress;
RECT MyRect;
CFile_Transfer* pvF=static_cast<CFile_Transfer *>(pParam);
CSocket soc1;
CSocket soc2;
soc1.Create(553);
soc1.Listen(1);
soc1.Accept(soc2);
pvF->pStatus->GetItemRect(1, &MyRect);
m_Progress.Create(WS_CHILD|WS_VISIBLE|PBS_SMOOTH, MyRect, pvF->pStatus, 1);
WIN32_FIND_DATA fd;
soc2.Receive(&fd,sizeof(WIN32_FIND_DATA));
m_Progress.SetRange(0,fd.nFileSizeLow/2048);
m_Progress.SetStep(1);
UINT dwRead = 0;
CFile destFile;
if(0==g_pos)
{
if(!destFile.Open(g_tpath+fd.cFileName+".nm", CFile::modeCreate | CFile::modeWrite | CFile::typeBinary))
{
destFile.Close();
soc2.Close();
return FALSE;
}
}
else
{
if(!destFile.Open(g_tpath+fd.cFileName+".nm", CFile::modeWrite | CFile::typeBinary))
{
destFile.Close();
soc2.Close();
return FALSE;
}
destFile.SeekToEnd();
}
while(dwRead<fd.nFileSizeLow-g_pos)
{
byte* data = new byte[2048];
memset(data,0,2048);
UINT dw=soc2.Receive(data,2048);
destFile.Write(data, dw);
dwRead+=dw;
delete [] data;
m_Progress.StepIt();
}
m_Progress.SetPos(fd.nFileSizeLow-g_pos);
m_Progress.DestroyWindow();
SetFileTime((HANDLE)destFile.m_hFile,&fd.ftCreationTime,
&fd.ftLastAccessTime,&fd.ftLastWriteTime);
SetFileAttributes(g_tpath+fd.cFileName+".nm",fd.dwFileAttributes);
destFile.Close();
soc2.Close();
soc1.Close();
rename(g_tpath+fd.cFileName+".nm",g_tpath+fd.cFileName);
pvF->SendMessage(WM_USER+334,0,0);
return 0;
}