WinSocket:发送大数据文件

hanphy 2000-11-21 05:00:00
请问各位大仙, 你们是如何发送和接收几十或上百兆的大量数据的?
...全文
288 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
meifen 2001-07-13
  • 打赏
  • 举报
回复
s
hanphy 2000-11-23
  • 打赏
  • 举报
回复
那对应于TransmitFile函数的win9x的接收函数又是什么,有没有?
> sxbyl回复于2000-11-21 18:30:00
> 在NT下,可参考TransmitFile函数,对于9x,自己慢慢传吧。
hanphy 2000-11-23
  • 打赏
  • 举报
回复
非常感谢sunlet的源代码,
由于发送的是大文件,我先前用的缓冲区大小4M,为了加快速度,还用两个缓冲区,引入一个读盘线程,同步读盘、发送.但是,可能是由于4M太大?程序在发送过程中,经常出现MFC的ASSERT错,说是在PumpMessages()函数中pSocketWnd==NULL(在文件sockcore.cpp Line850),但将缓冲区大小改成1k之后,有时也出现那个ASSERT错!!!
请问大家, 为何? 我该怎么办?
zzh 2000-11-22
  • 打赏
  • 举报
回复
通过从异步SOCKET派生一个类来处理数据的发送和接收问题。可以把文件数据进行打包,在接收时再解包,这样就可以了。系统会保证数据发送的正确性,不过,这里一定要注意对于接收缓冲区的处理, 一定要使用临界区来确保当前只有一个在操作缓冲区。
Sunlet 2000-11-21
  • 打赏
  • 举报
回复
方法一:用CSocket发送。阻塞方式,不会出错。
方法二:用CAnyncSocket发送。要自己处理阻塞。以下是我自己的一段代码。
经验证,发送百兆文件不会出错。

void ClientSock::OnConnect(int nErrorCode)
{
m_uSendLen=0;
CFile file;
try{
int readlen;
char buffer[1000];
file.Open("e:/testfile/testsrc",CFile::modeRead|CFile::shareDenyNone);
while((readlen=file.Read(buffer,1000))>0){
int sended=0;
int ret;
while(1) {
ret=Send(buffer+sended,readlen);
if (ret==SOCKET_ERROR){Sleep(10);continue;}
if(ret==readlen)break;
sended+=ret;
readlen-=ret;
}
m_uSendLen+=readlen;
}
}
catch(CFileException*){
AfxMessageBox("file error");
}
CString s;
s.Format("send out %u",m_uSendLen);
AfxMessageBox(s);

this->Close();

CAsyncSocket::OnConnect(nErrorCode);
}
sxbyl 2000-11-21
  • 打赏
  • 举报
回复
在NT下,可参考TransmitFile函数,对于9x,自己慢慢传吧。

16,472

社区成员

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

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

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