解决方案 »
- ActiveReport中打印报表采用针打对打印机有什么要求吗?另外纸型的设置有什么要求
- VB6与mysql的兼容性如何呀?能开发基于mysql的管理程序吗?客户必须要用mysql,因为版权原因
- ?用webbrower在网页上自动读写的问题
- 为什么我的工程中没有“添加Crystal Report 8.5”???
- 初学水晶报表,简单问题
- flash右键问题~~~~~
- exe程序运行结束后,报VB.exe应用程序错误
- 能否同时绑定两个表??
- 请问浏览器的默认填充地址栏是怎么做的?谢谢!(内空)
- 想得到不用注册的高级的报表控件
- 遇到一个很奇怪的问题。
- VB MSHFlexGrid 控件数据更新的问题
1、用固定的,客户端都知道的端口号去侦听客户端的连接请求;WINSOCK(0)属于临时性的服务;
2、一旦发现客户端有连接请求,为客户端分配新的端口,新的 WINSOCK 去建立持久性的连接服务;建议:
1、客户端用2个WINSOCK,第1个与SERVER端WINSOCK(0)连接,并且请求为其分配下一个可持久连接的端口,注意,这时不能在WINSOCK(0)为其返回一个端口号后马上断开连接,这时客户端应当用新得来的端口号与服务端的WINSOCK(X)试着进行连接,只有连接成功后,才应断开与WINSOCK(0)的连接。因为,虽然服务端发来的是它那边侦听成功后的可用的端口号,但这个端口号可能会被客户端中的其他进程所占用,客户端是不一定百分之百能用的;
2、如果受端口号的约束,可以这样,如固定1--3个端口号为服务端的临时侦听端口,再分配10--几十个端口号为持久性连接端口。而如果固定的那几十个持久连接端口在不够用的情况下,所谓的持久性连接必须转为断断续续的连接,也就是说,客户端超出一定数量时,要分批、分序与服务端连接,连接一定时长后断开,让给其他客户端;注:我的建议不一定好哦,只是思路而已,仅供参考!
谢谢楼上msailsoft老师,分析的非常细致,至少我能看明白。看来我的这个设计如果除4000端口开放外其它都是关闭的,数据没办法从客户端传送到服务器是吗?
Winsock1(0).LocalPort= 4000'指定侦听端口
Winsock1(0).Listen'开启侦听Private Sub Winsock1_ConnectionRequest(Index As Integer, ByVal requestID As Long)'侦听
If Index <> 0 Then Exit Sub 'index=0专用于侦听
Dim i As Long
For i = 1 To 10'动态生成控件数组减少到10个
If Onl(i) = 0 Then 'Onl(i)=0表示此号没使用
Load Winsock1(i) '加载新的控件
Winsock1(i).LocalPort= 4000+i '这是改进的关键
Winsock1(i).Accept requestID '用侦听控件外的其它控件来传数据,这个需要单独再开放别的端口吗?
Onl(i) = 1 '标记该WINSOCK号已使用中
Exit For
End If
Next
End Sub客户端的容错处理中,如果发现连接超时,就断开连接后用4000+1+int(10*rnd(1))作为新本机端口(就是4000以后从1到10的随机端口)继续连接服务器。程序改进后在没有防火墙的环境下测试运行良好,可惜我需要的是在用严格端口控制的防火墙环境测试。希望高手继续帮我分析,这个思路对不对。