请教:用Winsock定时向20多个终端发送数据,工作一段时间后Winsock会停机,求教。
程序代码如下:
Timer1 控件设定间隔为 10 秒。
Private Sub Timer1_Timer()
。。。。。。。。。。
'从数据库读取数据
。。。。。。。。。。
,拼装数据
。。。。。。。。。。
Debug.Pring 拼装好的数据 & Now() '程序运行到这里时正常的。
Dim wskTemp As Winsock
For Each wskTemp In Me.Winsock1
If wskTemp.State = sckConnected Then
wskTemp.SendData "待发送的数据" & "▲" & "待发送的数据"
End If
Debug.Pring "待发送的数据" & "▲" & "待发送的数据" & Now() '程序开始很正常,但工作大约十几个小时后这段代码就不再执行,也不向外发送数据了。程序的 Timer1 间隔工作还是正常的,但程序运行变得有些慢。
Next
Set wskTemp = Nothing
。。。。。。。。。。。
。。。。。。。。。。。
End Sub
操作系统 Windows Server2003,数据库 SQL2008。
程序开始工作正常,十几个小时后程序仍在运行,但不再向外发送数据,查看系统进程和内存使用情况,没有发现异常。
请教各位,我的问题出在哪里?是否要定时清空发送缓冲区,如何清空呢?谢谢!
[解决办法]
Dim wskTemp As Winsock
提到窗体声明部分.
Set wskTemp = Nothing
放到窗体退出结束部分.
[解决办法]
我觉得没那么简单
[解决办法]
没办法,你的对象都没销毁,你可以用netstat -na 看一下程序到底占用了多少PORT。
[解决办法]
应该与你这段代码无关
Dim wskTemp As Winsock
For Each wskTemp In Me.Winsock1
If wskTemp.State = sckConnected Then
wskTemp.SendData "待发送的数据" & "▲" & "待发送的数据"
End If
事实上,这段代码并没有NEW新的对象出来,你后行那一行set wskTemp=nothing也完全是多余的。
你应该在其它地方检查原因
[解决办法]
这段代码没有问题,问题出在其它地方。
[解决办法]
查看PC内在占用情况,查看winsock的生成与销毁过程。
[解决办法]
循环中没有任何停顿地发送数据,非常容易引起事件的嵌套。
建议加入等待,等一个终端的发送成功或失败后再循环下一个。
[解决办法]
我也正在写一个网络版工具,不过我的模式跟你的有点不一样,我的模式是“1个管理端->N个服务端->N个客户端”的模式,即我需要把服务端放到N多不同的服务器上,通过外网映射端口后,我可以用管理端反向连接,同时每个服务端支持最大一千个客户端连接,也有考虑到服务端winsock的工作模式,目前我的直接办法是在窗体上画一个Winsock1(0),然后用for来Load Winsock1(n),我的Load对象个数是下标最大为1002,其中0用来侦听客户端连接,1001用来在1-1000全部都连接后用来应答客户端连接已满。1002则是等待管理端的连接。不知道各位对我这想法有何高见?
[解决办法]
我觉得没那么简单
[解决办法]
State 属性(Winsock 控件)
返回控件的状态,用枚举类型来表示。在设计时是只读的,而且是不可用的。
语法
object.State
object 所在处代表一个对象表达式,其值是“应用于”列表中的对象。
数据类型
Integer
设置值
State 属性的设置值是:
常数 值 描述
sckClosed 0 缺省的。关闭
sckOpen 1 打开
sckListening 2 侦听
sckConnectionPending 3 连接挂起
sckResolvingHost 4 识别主机
sckHostResolved 5 已识别主机
sckConnecting 6 正在连接
sckConnected 7 已连接
sckClosing 8 同级人员正在关闭连接
sckError 9 错误
[解决办法]
SendComplete 事件
在完成一个发送操作时出现。
语法
object_SendComplete
object 所在处代表一个对象表达式,其值是“应用于”列表中的对象。
参数
None
SendProgress 事件
在发送数据期间出现。
语法
object_SendProgress (bytesSent As Long, bytesRemaining As Long)
SendProgress 事件的语法包含下面部分:
部分 描述
object 对象表达式,其值是“应用于”列表中的对象。
bytesSent 从上次激活事件以来已发送的字节数。
bytesRemaining 在发送缓冲区等待发送时的字节数。
