CSocket传送大文件问题

annywoody 2007-04-29 11:05:43
服务器端代码
CFile myFile;
myFile.Open("D:\\test.txt", CFile::modeRead | CFile::typeBinary);

int myFileLength = myFile.GetLength(); // Going to send the correct File Size

sockRecv.Send(&myFileLength, 4); // 4 bytes long

byte* data = new byte[myFileLength];

myFile.Read(data, myFileLength);

//sockRecv.Send(data, myFileLength); //Send the whole thing now
for(int i=0;i<=myFileLength;i+=1024)
{
sockRecv.Send(data+i,1024); //Send the whole thing now
Sleep(10);
}
if(myFileLength%1024!=0)
sockRecv.Send(data+myFileLength-myFileLength%1024,myFileLength%1024);

...全文
2236 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
caitian6 2007-05-07
  • 打赏
  • 举报
回复
mark
nov30th 2007-05-06
  • 打赏
  • 举报
回复
简单方法。

用循环发送二进制123456789……这样的数据,接收方保存到文件,之后打开可以看哪里出的问题。
rainv 2007-05-04
  • 打赏
  • 举报
回复
mark
嗷嗷叫的老马 2007-05-02
  • 打赏
  • 举报
回复
.....................................................
fulingwei 2007-04-29
  • 打赏
  • 举报
回复
DEMO已经发送,请查收
setsailgo 2007-04-29
  • 打赏
  • 举报
回复
for(int i=0;i<=myFileLength;i+=1024)
{
while(sockRecv.Send(data+i,1024)!=1024)
{}
Sleep(10);
}
vcayi 2007-04-29
  • 打赏
  • 举报
回复
一般传文件不是一次性读出来然后一次性send出去的,而是一次读一小部分比如1024个字节然后发出去,这样循环直到文件发送完毕
annywoody 2007-04-29
  • 打赏
  • 举报
回复
要多大?
CathySun118 2007-04-29
  • 打赏
  • 举报
回复
接收缓冲加大些
annywoody 2007-04-29
  • 打赏
  • 举报
回复
打开文件的部分没问题
就是程序中设置不了断点
但我觉得发送数据也成功发送的
lzd 2007-04-29
  • 打赏
  • 举报
回复
// 获取数据
nDWORD CSocket::RecvTCP( void* pBuffer , DWORD dwLength , DWORD dwFlags )
{
long lCurRecv =0;
while( 1 )
{
int iTemp = recv( socket , ( nPCHAR )pBuffer+lCurRecv , ( nINT )dwLength , ( nINT )dwFlags );

if( iTemp == SOCKET_ERROR )
{
int iError = WSAGetLastError();

if( iError != WSAEWOULDBLOCK )
return FALSE;
}
else
{
lCurRecv+= iTemp;
dwLength -= iTemp;
if( 0 == dwLength )
break;
}
}
return TRUE;
}

// 发送数据
nDWORD CSocket::SendTCP( void* pBuffer , DWORD dwLength , DWORD dwFlags )
{
long lCurSend = 0;
while (1)
{
int iTemp = send( socket , ( nPCHAR )pBuffer+lCurSend , ( nINT )dwLength , ( nINT )dwFlags );

if( iTemp== SOCKET_ERROR )
{
if( WSAGetLastError() != WSAEWOULDBLOCK )
return FALSE;
}
else
{
lCurSend +=iTemp;
dwLength -= iTemp;
if( 0 == dwLength )
break;
}
}
return TRUE;
}
lzd 2007-04-29
  • 打赏
  • 举报
回复
接收的时候也是检查Receive是否成功。。以及成功接收的字节数。。
lzd 2007-04-29
  • 打赏
  • 举报
回复
检查一下myFile.Read是否成功以及成功的字节数。。

发送的时候检查Send返回是否成功。以及成功传送的字节数。。
annywoody 2007-04-29
  • 打赏
  • 举报
回复
客户端代码:
byte* data = new byte[dataLength];
//sockClient.Receive(data, dataLength); //Get the whole thing
for(int i=0;i<=dataLength;i+=1024)
sockClient.Receive(data+i,1024); //Get the whole thing now
if(dataLength%1024!=0)
sockClient.Receive(data+dataLength-dataLength%1024,dataLength%1024);

接受的数据写入文件后并不正确
我实际读写的是个.exe文件,代码中暂且就用的txt文件代替
程序也无法设置断点
保证读文件部分代码是正确的,如果哪位有代码能否发到我的邮箱
li.xin2006@yahoo.com.cn
必须是能传送大文件的哦

http://www.codeproject.com/internet/SocketFileTransfer.asp这个是我参考的文章
http://topic.csdn.net/t/20021011/08/1086665.html#
annywoody 2007-04-29
  • 打赏
  • 举报
回复
明天结贴
annywoody 2007-04-29
  • 打赏
  • 举报
回复
读文件的大小是64k,哈哈
以前读的文本文件都很小没注意
现在知道了
shenyi0106 2007-04-29
  • 打赏
  • 举报
回复
CFile类的Read只能一次读去小于64K大小的文件,如果要一次读取大于64K,那么请用ReadHuge,原因请查MSDN
annywoody 2007-04-29
  • 打赏
  • 举报
回复
我在网上找到的一段代码
简洁明了

UINT dwRead=0;
while(dwRead<StreamFileInfo.nFileSizeLow)
{
byte* data = new byte[1024];
UINT dw=myFile.Read(data, 1024);
sockRecv.Send(data, dw);
dwRead+=dw;
delete [] data;
}
annywoody 2007-04-29
  • 打赏
  • 举报
回复
vckbase上的帖子我看了
发不了大文件,我的程序就是在他的基础上改的
sinovoice 2007-04-29
  • 打赏
  • 举报
回复
发送数据部分好像有问题。昨天就有人出现你类似问题,。你可以搜索以下帖子。另:vckbase上也有相关文章。
加载更多回复(2)

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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