在服务器上装有win2003系统,并用winsock控件数组实现了8台客户机进行tcp/ip连接,但在运行一段时间后,会自动断开几个连接,只会保留1-2个连接,因为在客户端用timer进行检测如有断开会自动连接,但都是无法再次连接。服务器同时还作打印服务器,请问是怎么回事?怎么解决?
谢谢!

解决方案 »

  1.   

    VB做Socket服务是不行的,实在要做,用ACE吧。
      

  2.   

    回复人: samwzhang(分全给我) ( ) 信誉:100 :胡说八道,
    楼主的程序肯定有问题, 如果用winsock数组,记得变量也用数组为每个winsock分配一个,用tcp联接怎么还用时钟呢?!
    它有个联接 state 嘛!, Private Sub wsListen_ConnectionRequest(Index As Integer, ByVal requestID As Long)
       Dim i As Integer
       Dim SetConnet As Boolean
       SetConnet = False ' 还没有把请求传给该winsock
       
       If Index = 0 Then
          
          If UBound(FreeIndex) = 0 Then '没有创建Winsock,初始状态
              Load wsListen(1)     '创建一个Winsock
              wsListen(1).LocalPort = 0
              wsListen(1).Accept requestID
              ReDim FreeIndex(1)
              FreeIndex(1) = "Busy"
              Call ShowInfo(CStr(requestID), "Busy")
              GoTo TheLine
          End If
          
          For i = 1 To UBound(FreeIndex)
              If FreeIndex(i) = "Free" Then '如果Winsock数组I空闲
                 wsListen(i).Accept requestID  '则让它接收
                 FreeIndex(i) = "Busy" '设置成忙状态
                  SetConnet = True
                 GoTo TheLine
              End If
          Next
          
          If SetConnet = False Then   '没有空闲的Winsock
             ReDim Preserve FreeIndex(UBound(FreeIndex) + 1) '注册
             Load wsListen(UBound(FreeIndex))    '创建一个Winsock
             wsListen(UBound(FreeIndex)).LocalPort = 0
             wsListen(UBound(FreeIndex)).Accept requestID
             FreeIndex(UBound(FreeIndex)) = "Busy"
             Call ShowInfo(CStr(requestID), "Busy")
          End If
          
    TheLine:      ReDim Preserve GotHeader(1 To UBound(FreeIndex))
          ReDim Preserve FileNum(1 To UBound(FreeIndex))
          ReDim Preserve Receivedbyt(1 To UBound(FreeIndex))
          ReDim Preserve ByteSec(1 To UBound(FreeIndex))
      End If
      
    End Sub
      

  3.   

    也就是 多个winsock 之间不要有共享变量,如果有就会出错
      

  4.   

    你说行,那你给我单线程开个100个Socket看看还能不能正常通信,如果能,那是你的机器好,再开1000个试试。
    如果你说VB也可以多线程,那也行,你试试开个100个线程,但是又要操作机器上的一些资源,看看你的程序会不会挂?
    要是也能通过,那么I 服了 YOU
      

  5.   

    ACE是开源的工具,全世界的程序员都可以修改,已经运行10来年了。很成熟的东西,你上网搜索下,很容易下载到的。
      

  6.   

    我这里有套ACE,带源码50M,怎么贴啊?自己去Google搜吧,一搜就搜到了。
      

  7.   

    说明:
    我是用VB做了个OCX控件
    程序在win2000server下运行没有问题的,已经做了5年的报税;
    现在在2003server下有自动断开的现象,应该是和系统有关
    timer是在控件外的程序里的有调用 state的
    回 qscandwh(思成)
    变量也有分配index的
      

  8.   

    你把win2000的 。winsock控件打倒安装包中  2003好像和2000的版本不同