为什么要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和端口,然后点接收文件。按钮只能点一次。因为没有出错判断……
给好评喔,亲
把你写的代码的关键部分贴上来