winsock,奇怪的dataarriva事件...

dhhm 2008-03-29 08:24:08
利用winsock控件,想做个ftp的程序,请看代码

其中:
chb_count为全局变量,
winsock2为ftp建立的数据链路,
以下代码,是winsock2的dataarrival的事件代码

dim get_data as string
chb_count = chb_count + 1
if winsock2.state=sckConnected then
winsock2.GetData( ref get_data)
text1.text=text1.text+get_data
else
messagebox(string(winsock2.state),string(BytesTotal))
end if

在接收了一个很短的信息后(远远不足8k),chb_count的值为2,也就是说,dataarrival事件被触发了两次。
其中一次,触发了else条件里的语句winsock2.state=sckClosing, BytesTotal=0

代码写成这样,也是我在调试程序时,发现有点异样,用来检查情况的。
请高手能否解释一下这个现象?

原本就想简单写成:
winsock2.GetData( ref get_data)
text1.text=text1.text+get_data
可是程序有时候报错,也就是winsock2.state=sckClosing时,也触发了dataarrival事件,
而winsock2.state=sckClosing时,执行getdata方法是不可以的.

...全文
106 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
ZOU_SEAFARER 2008-03-31
  • 打赏
  • 举报
回复
不用怀疑!要是有BUG早就被发现了!

你代码里面有CLOSE语句吧
dhhm 2008-03-31
  • 打赏
  • 举报
回复
是个ftp的程序,对方是ftp服务器,我无法判断对方的行为,我只要收数据。

我只发了个list命令过去,想收列表信息,出现上述错误。
在出错时,实际上我已经收全了列表数据,但还是触发了dataarrival,造成出错。

注:不是所有的服务器,都会出错,有的正常。


我怀疑是mswinsck的一个bug.
Tiger_Zhao 2008-03-31
  • 打赏
  • 举报
回复
首先要确认的确是数据重发而不是分段发送了两次。
其次会不会是数据发送方发送了两次?
dhhm 2008-03-31
  • 打赏
  • 举报
回复
原本就想简单写成:
winsock2.GetData( ref get_data)
text1.text=text1.text+get_data

这就是直接接收,可是出错了啊。

代码执行完后->控制权交系统->state状态变化->又触发了dataarrival->出错!

问题在于:又触发了dataarrival?!
Tiger_Zhao 2008-03-31
  • 打赏
  • 举报
回复
因为sock是异步的,所以在你的dataarrival事件中去检查状态可能成为sckClosing了。
直接接收数据,不用管状态。
junki 2008-03-31
  • 打赏
  • 举报
回复
我都是直接写的,没有出现你那样的问题啊
是不是你的设置有问题,你什么时候会出现这种情况

7,764

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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