本帖最后由 wangxuejun 于 2010-11-11 13:27:27 编辑

解决方案 »

  1.   

    是的,已经与 WINSOCK(0)4000 端口连接了客户端的服务端,如果改用其他 WINSOCK(X)[注:X>0],与客户端进行持久连接的话,就得用别的端口号了,因为 4000 已经被占用了;实际上,你的 WINSOCK(0)应该有以下功能:
    1、用固定的,客户端都知道的端口号去侦听客户端的连接请求;WINSOCK(0)属于临时性的服务;
    2、一旦发现客户端有连接请求,为客户端分配新的端口,新的 WINSOCK 去建立持久性的连接服务;建议:
    1、客户端用2个WINSOCK,第1个与SERVER端WINSOCK(0)连接,并且请求为其分配下一个可持久连接的端口,注意,这时不能在WINSOCK(0)为其返回一个端口号后马上断开连接,这时客户端应当用新得来的端口号与服务端的WINSOCK(X)试着进行连接,只有连接成功后,才应断开与WINSOCK(0)的连接。因为,虽然服务端发来的是它那边侦听成功后的可用的端口号,但这个端口号可能会被客户端中的其他进程所占用,客户端是不一定百分之百能用的;
    2、如果受端口号的约束,可以这样,如固定1--3个端口号为服务端的临时侦听端口,再分配10--几十个端口号为持久性连接端口。而如果固定的那几十个持久连接端口在不够用的情况下,所谓的持久性连接必须转为断断续续的连接,也就是说,客户端超出一定数量时,要分批、分序与服务端连接,连接一定时长后断开,让给其他客户端;注:我的建议不一定好哦,只是思路而已,仅供参考!
      

  2.   


    谢谢楼上msailsoft老师,分析的非常细致,至少我能看明白。看来我的这个设计如果除4000端口开放外其它都是关闭的,数据没办法从客户端传送到服务器是吗?
      

  3.   

    没条件试,我这里的网络环境没有批量全部封锁端口的防火墙,系统自带的能力太弱。我现在的作法是为动态生成的控件分别指定一个本机端口,将源代码中最多255个控件数组压缩为10个,这个算上侦听控件,一共要求网络开放11个端口。客户端控件也只定为这11个以内的端口用于连接。这样作,在不知道新生成的控件到底用不用其它端口的情况下,作了假设用的处理,无论是用还是不用,程序都应该可以正常使用,不知道我分析的对不对,可惜没真的防火的墙把这11个端口以外的口都禁掉来测试一下。这是改进后的服务器端
    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的随机端口)继续连接服务器。程序改进后在没有防火墙的环境下测试运行良好,可惜我需要的是在用严格端口控制的防火墙环境测试。希望高手继续帮我分析,这个思路对不对。
      

  4.   

    服务器建立端口后,等待客户端的链接,链接建立成功后,socket就是有效的,通过这个socket就可以进行数据传输了啊?数据传输只和虚拟链路(socket)有关,难道除了监听端口外,进行数据传输时还会在临时开放其他端口?
      

  5.   

    搞不明白楼主为啥要用WINSOCK控件数据做服务端。accept以后会生成一个sockid,用这个sockid就可以传输数据了~
      

  6.   

    CSDN不允许修改贴子,真要命运,不然我把代码贴过来大家分析分析,防火墙是否有可能影响数据传送。
      

  7.   

    而且,客户那里的网管说,把这硬件防火墙这11个端口也开放了。为什么就不行呢?服务器是WIN2000的,本身又没有防火墙,客户那里安全很严格,应该也不会有ARP等影响TCP/IP的病毒,到底是什么地方阻止了我的数据传输,因为我对硬件防火墙不怎么了解,因为软件在其他客户手中都能正常用,只能告诉他们,是网络阻挡数据最大的可能还在防火墙上,别的我也没办法了。