受不了了,CAsyncSocket对象OnReceive()后莫名其妙地触发OnSend().

smn 2003-04-11 10:21:30
一个CAsyncSocket实现的FTP客户端,在监听连接Accept给"传送文件"连接后再根据条件写上:

AsyncSelect(FD_WRITE|FD_CLOSE);//上传时
AsyncSelect(FD_READ|FD_CLOSE);//下载时

在"传送文件"连接里的OnReceive()除了Receive(...)就没有其它控件此套接字的语句.OnSend()除了Send(...)以外就是最后一个Close();通知服务器上传完毕.

这种做法上传是没有问题的,但是在下载一个文件后,就是执行完"传送文件"连接的OnReceive()后,总是莫名其妙地接着执行OnSend()函数,我试过下载完文件后马上ShutDown()或者Close()都不行.当然我可以根据上传还是下载的标志变量来避免执行OnSend()里的函数体,但是我想知道这种错误的原因在哪里,最好的解决方法是什么,是我哪里写错了吗?

分不够的话我可以另开贴加分.
...全文
81 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
smn 2003-04-16
  • 打赏
  • 举报
回复
是在传完整个文件才自动触发的.
服务器和客户端的应答我都很清楚,确实没有写代码触发过OnSend().
smn 2003-04-16
  • 打赏
  • 举报
回复
我特意做了一个CAsyncSocket对象作为数据连接与服务器应答,只接收数据不发送数据,但我在其OnSend()中弹出警告框以提示有触发OnSend(),结果它接收完服务器的数据后果然马上触发了OnSend().
但此观点却对控制连接不适用,当服务器传来应答码226后,控件连接并不自动触发OnSend().看来要得出个所以然来还得看看FTP协议.

这个问题我个人认为 BinaryTreeEx(狂徒) 的答案是正确的,当然我不敢肯定.
BinaryTreeEx 2003-04-16
  • 打赏
  • 举报
回复
msdn中是这样说的:当可以发送数据的时候,onsend事件函数就会被触发调用。我是这样理解的:当上次数据接收操作完成就会触发该函数。应为通讯是双方一应一答得过程,当你接受完对方数据那么意味着你应该做出应答,也就是发送数据被对方,所以MFC用这个函数通知你,你可以发数据了。
Jiemi 2003-04-15
  • 打赏
  • 举报
回复
恩,用winsock好。
shesh 2003-04-15
  • 打赏
  • 举报
回复
我觉得根本不用监视SEND事件,把发送缓冲定大点就行,
iboxer 2003-04-15
  • 打赏
  • 举报
回复
还是自己重新封装winsock api 比较好,至少自己心中有数,不会太麻烦的。
帮你up,希望有高手能帮你解决难题。/
zhanghuan 2003-04-15
  • 打赏
  • 举报
回复
你是在传完整个文件是才触发OnSend()的吗??
是不是你在程序哪里触发的??

帮你up一下
用户 昵称 2003-04-15
  • 打赏
  • 举报
回复
还是用socket写最省心。
smn 2003-04-15
  • 打赏
  • 举报
回复
谢谢大家的意见,早知道这样我就用winsock写了,可是现在改的话会牵动整个结构,跟重写差不多了.
ccbcc 2003-04-14
  • 打赏
  • 举报
回复
用CAsyncSocket会被气死,还不如用直接用网络接口函数从头写。
smn 2003-04-14
  • 打赏
  • 举报
回复
lichungen(阿根) :
我知道"OnSend在SOCKET的OnConnect的事件后会触发",我在连接后就USER,PASS,LIST,全部OK,整个SOCKET已经"停"下来没有任何传送了.然后我再RETR触发OnReceive()或者STOR触发OnSend(),后者没问题,就是前者OnReceive()后它自动触发OnSend().

谢谢你的关注,继续等...
smn 2003-04-14
  • 打赏
  • 举报
回复
lichungen 2003-04-12
  • 打赏
  • 举报
回复
OnSend在SOCKET的OnConnect的事件后会触发,有可能是OnConnect后,有数据需接收因而先OnRecevie, 等OnReceive执行完后,再触发OnSend
devzhao 2003-04-12
  • 打赏
  • 举报
回复
up
smn 2003-04-11
  • 打赏
  • 举报
回复
free_card() :
那什么上传就是OnSend()就不会触发OnReceive()呢?该如何解决"当发送缓冲区为空时,触发onsend()"这个问题?谢谢!
night_cat 2003-04-11
  • 打赏
  • 举报
回复
up
free_card 2003-04-11
  • 打赏
  • 举报
回复
当发送缓冲区为空时,触发onsend()

18,356

社区成员

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

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