在MFC中用winsock方法解决文件传输问题
为什么要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的时候就走到头了是指哪一行代码?
这个问题我这里没能重现,“返回到头”是指什么我也不知道,说具体一点吧,说具体一点我把程序代码再检查一下