在MFC中用winsock方法解决文件传输问题

MFC中网络编程的方法有两种。我用winsock方法(不是CSocket方法)并且是异步套接字方法编了一个传输文件的程序,可是感觉传输速度好慢。500k的东西要传半分钟。... MFC中网络编程的方法有两种。我用winsock方法(不是CSocket方法)并且是异步套接字方法编了一个传输文件的程序,可是感觉传输速度好慢。500k的东西要传半分钟。我的接收数组大小为8700B,每次接收完直接写数据,都要sleep200多毫秒一下,不然接收数据就会出错。所以现在我想提高一下速度。可是sleep少了不行,增大接收数组的长度也不行。听网上说,winsock的接收数组最大也就8K左右,不知道是不是。我试了一下发现还真差不多。所以我想问问各位大神,我还怎么解决啊?我不太会用多线程,所以希望不用多线程的方法。感觉这个问题应该可以解决,如果真是这个传输速度,那这个机制岂不是早就淘汰了。所以请各位大神帮帮忙。帮我解决问题,或者有现成的代码也行,只要是用winsock机制完成传输大一点的文件就行。我的邮箱是944387590@qq.com。困扰我三天了,先谢谢各位大神。 展开
 我来答
空雪梦见
2013-07-12 · TA获得超过5597个赞
知道大有可为答主
回答量:2522
采纳率:75%
帮助的人:1196万
展开全部

为什么要sleep,“不然接收数据就会出错”是啥,你到底干了什么神奇的事情…………

我先问一下,你会用异步套接字吗?你所谓的“不然接收数据就会出错”是不是指调用接收函数,但是事实上没有数据过来,此时它返回错误?

你不要多线程,mfc程序平时都在执行一个消息循环,所以你要做的就是往消息循环里面添加自己的处理,然后在socket上调用wsaasyncselect,这样数据来的时候你就会收到消息,然后执行“添加的自己的处理”,此时调用接收就不会出错。

建议你参考一下消息方式异步的处理。别再sleep了

 

 

好吧,我尝试冲一个优质答案。希望能采纳。

我写了一整个教学,虽然代码中几乎没有出错判断(为了简化、突出重点)

所以真正实用中,要注意这些函数在执行失败的时候会有什么行为,然后给出正确的处理代码

 

看好了:

首先创建一个对话框应用程序。为了方便使用控件所以选了对话框应用程序

 

记得要加socket支持

 

不要跟我说画这样一个界面不会画

 

然后创建变量,上面的服务器端口是m_servport,服务器ip是m_servaddr,下面的监听端口是m_listenport。这是基本功

 

添加类,两个从CAsyncSocket派生出来的类,一个用于发文件一个用于收文件

 

发送的一端至少要重载这几个虚拟函数

 

接收端:

 

注意!

两端都要添加一个HANDLE表示要读/写的文件,public成员m_hFile。对话框那边打开了文件把句柄送进来的

注意!

 

这是参考实现:

 

有新客户端连接的时候,OnAccept被调用。此时停止监听,然后把当前对象内的socket换成新来的socket,然后重新等待(等待可写)

 

当可以发送文件的时候就读文件然后发,之后等待下一次发送时机。如果文件读完了,就关闭连接

 

接收文件的时候,把收到的数据存入文件,然后继续等待数据

 

发送完成以后会关闭连接,那么如果接收端被断开就说明文件收完了。

 

 

然后是按钮的处理。这里为了简化,没有编写选择文件之类的代码。直接就假设发送的是c:\1.dat,接收到c:\2.dat

发送的代码。注意这里只有new没有delete,也就是说创建对象以后这里就失去控制权了。这也是为什么接收完了以后要delete
this的原因

 

接收的代码,同理。

 

 

参考运行结果如图。注意要保证c:\1.dat文件的存在。顺序一定是发送端输入端口,点发送文件,然后接收端输入ip和端口,然后点接收文件。按钮只能点一次。因为没有出错判断……

给好评喔,亲

更多追问追答
追问
我不知道为啥竟然提问了两次。。。不过确实谢谢你,哥们,费了一晚上写代码,你的代码我运行了,不过我把文件和文件路径改了,这应该没问题吧?(确定存在)可是当客户端点接收的时候,服务端就会出错,我是按你的流程走的。我debug了一下,发现到判断msg的时候就返回到头了,为什么呢?
追答
文件和文件路径改了没问题啊,只要能成功打开。
然后我仔细看了一下,发现你这个追问是针对我另一个回答的……
是这样的,我在两个问题下的回答用了不同的方式……一个用了WSAAsyncSelect,一个用了WSAEventSelect

判断msg的时候就走到头了是指哪一行代码?
这个问题我这里没能重现,“返回到头”是指什么我也不知道,说具体一点吧,说具体一点我把程序代码再检查一下
百度网友c6c78e9
2013-07-11 · TA获得超过2283个赞
知道小有建树答主
回答量:620
采纳率:0%
帮助的人:997万
展开全部
把你写的代码的关键部分贴上来
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式