读书人

为啥用winsock控件连续发数据发到1000

发布时间: 2012-12-16 12:02:32 作者: rapoo

为什么用winsock控件连续发数据发到1000多次时就会变慢?
部分代码如下


Private Sub Command3_Click()
For i = 0 To Text2.Text - 1
If Winsock1(i).State <> 0 Then
Winsock1(i).Close
End If
Winsock1(i).Connect "www.XXX.com", 80
Next
End Sub
Private Sub Winsock1_Connect(Index As Integer)
Winsock1(Index).SendData da 'da为http Get数据
a = a + 1
End Sub
Private Sub Winsock1_SendComplete(Index As Integer)
Call fin(Index)
End Sub
Private Sub fin(i As Integer)
If Winsock1(i).State <> 0 Then
Winsock1(i).Close
End If
Winsock1(i).Connect "www.XXX.com", 80
End Sub

winsock控件没有设置本地端口
用一个winsock太慢了,每秒才发五次,所以我用了控件数组,但是为什么速度每秒也就60多次,不能再上去了呢?上行速度还没达到最大带宽啊,而且每发一千次多点也就是a=1000+时,就会停下来几过秒才能继续,为什么?为什么???
[最优解释]
引用:
而且每发一千次多点也就是a=1000+时,就会停下来几过秒才能继续,为什么?

至于每发一千次多点也就是a=1000+时,就会停下来几过秒,
是因为你每次虽然都close了,但是并没有卸载控件,一直占着资源,消耗内存。应该这样卸载掉不再用的socket(因为你已经都关闭了,也用不着了)

Private Sub fin(i As Integer)
If Winsock1(i).State <> 0 Then
Winsock1(i).Close
unload winsock(i)
End If
Winsock1(i).Connect "www.XXX.com", 80
End Sub



[其他解释]
不会吧,没人会用winsock?
[其他解释]
winsock控件数组很可能有并发的情况,某一时刻占用cpu的情况会较突出,有可能产生那个问题.
不如搞个多线程的试试
[其他解释]
使用长连接、不使用控件数组每次去断开再连接。发送的数据在循环内连续发送即可。

Private Sub Command3_Click()
For i = 0 To Text2.Text - 1
If Winsock1(i).State ==7 Then '这里忘了是否是7,应该是的。
winsock1(i).sendata "XXXX"
End If
Next
End Sub

[其他解释]
引用:
用一个winsock太慢了,每秒才发五次,所以我用了控件数组

应该不是winsock发送慢的问题。要么就是你客户端需要等待服务器端消息响应后才继续发送下一条信息。要么就是其他代码问题。
[其他解释]
什么是 上行速度还没达到最大带宽啊?
TCP的传输效率本来就低的可怜??
同样的网络条件,换UDP效率起码要提高5倍。


[其他解释]
引用:
引用:
用一个winsock太慢了,每秒才发五次,所以我用了控件数组

应该不是winsock发送慢的问题。要么就是你客户端需要等待服务器端消息响应后才继续发送下一条信息。要么就是其他代码问题。

不是响应后再发,而是发了之后服务器端会主动关闭连接的,这样就成半连接状态了,如果客户端不close再重连怎么再发下一个数据
------其他解决方案--------------------


引用:
什么是 上行速度还没达到最大带宽啊?
TCP的传输效率本来就低的可怜??
同样的网络条件,换UDP效率起码要提高5倍。

上行速度还没达到最大带宽就是假如我家ADSL上传速度最高可达50kb/s,但winsock发数据时只用了10kb/s说明速度还可以再提高
web服务器能用UDP连接的么?
[其他解释]
引用:
使用长连接、不使用控件数组每次去断开再连接。发送的数据在循环内连续发送即可。

Private Sub Command3_Click()
For i = 0 To Text2.Text - 1
If Winsock1(i).State ==7 Then '这里忘了是否是7,应该是的。
winsock1(i).sendata "XXXX"
End If
Next
……

不可以这样的,因为服务端收到数据后会主动关闭连接,而我的意愿是连续发数据到服务器,由于服务器会自主关闭连接那不如在SendComplete时客户端就close再Connect以提高速度,不必等服务端close再close
[其他解释]
Private Sub Command3_Click()
For i = 0 To Text2.Text - 1
If Winsock1(i).State <> 0 Then
Winsock1(i).Close
End If
Winsock1(i).Connect "www.XXX.com", 80
Next
End Sub

Private Sub Winsock1_SendComplete(Index As Integer)
Call fin(Index)
End Sub
这两者重复了。虽然没造成明显或严重的错误,但引起楼主所说情况一点不意外。如果你换成一种带有计算的操作,看看结果会怎样就明白了。
[其他解释]
你这是想DDOS么?
[其他解释]
引用:
Private Sub Command3_Click()
For i = 0 To Text2.Text - 1
If Winsock1(i).State <> 0 Then
Winsock1(i).Close
End If
Winsock1(i).Connect "www.XXX.com", 80
Next
End Sub

Private Sub W……

没有重复!
Command3_Click事件发生后请求连接服务器
连上后就会发生Winsock1_Connect事件
Winsock1_Connect后发送数据
发完后发生Winsock1_SendComplete事件
SendComplete后调用fin过程重新连接
连上后又发生Connect件事
Connect后又发数据
发完后产生SendComplete事件
SendComplete后又调用fin过程……一直循环下去
流程很明确每个过程之间没有重复

出错另有处理,没贴完代码,不过出错率极低,我在出错处设置断点,运行了很长时间才出现一个错误
[其他解释]
引用:
你这是想DDOS么?

额~~
被老马知道了

读书人网 >VB

热点推荐