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方法是不可以的.

...全文
54 点赞 收藏 6
写回复
6 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
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
我都是直接写的,没有出现你那样的问题啊
是不是你的设置有问题,你什么时候会出现这种情况
回复
相关推荐
发帖
VB基础类
创建于2007-09-28

7490

社区成员

VB 基础类
申请成为版主
帖子事件
创建了帖子
2008-03-29 08:24
社区公告
暂无公告