我只会写一个点的n个点winsock能行么?
会不会有什么问题是不是必须用vc+多线程?http://expert.csdn.net/Expert/topic/2653/2653375.xml?temp=.1180994

解决方案 »

  1.   

    使用winsock控件数组就可以做到
      

  2.   

    Private Sub Form_Load()
       Dim I As Integer
       Winsock1(0).LocalPort = 3333
       Winsock1(0).Listen
       For I = 1 To Clients
          Load Winsock1(I)
       Next
    End Sub
      

  3.   

    http://202.205.107.80/wangshangjiaoxue/kejian/daxuewuli/daxuewuli-fanshixi/VB/lecture1/13.htm我看这页基本明白了,也大概想出怎么实现了弄一个long型的计数
    楼上再帮我看看这个好么:
    http://expert.csdn.net/Expert/topic/2663/2663382.xml?temp=.4723932这才是关键的问题,要不然我就算解决了多客户连接也不行
      

  4.   

    还有问题
    DataArrival事件我怎么判断是哪个client的?
      

  5.   

    to:online(龙卷风V2.0--再战江湖) 
    -----------------------
    Private Sub Form_Load()
       Dim I As Integer
       Winsock1(0).LocalPort = 3333
       Winsock1(0).Listen
       For I = 1 To Clients
          Load Winsock1(I)
       Next
    End Sub
    -----------------------你这是预先把所有的sock都Load
    我这里可能会有成千上万个client端(当然不是同时),而且程序也需要7x24小时运行但是我看用winsock控件数组的方式
    winsock(index) index 为integer型
    最大只能有32xxx
    但是我这里的连接数是不确定的我如何才能即时的load呢
    我试了一下,在没有load winsock(i)之前
    是不能判断winsock(i).state的我写的
    -------------------------------------
    Private Sub tcpServer_ConnectionRequest(Index As Integer, ByVal requestID As Long)
        intSockNo = intSockNo + 1 'intSockNo初值0
        While tcpServer(intSockNo).State <> sckClosed <---会在这里报错:Control array element '1' doesn't exist
            intSockNo = intSockNo + 1
                If intSockNo > 32000 Then 
                    intSockNo = 1
                End If
        Wend
        Load tcpServer(intSockNo)    
        tcpServer(intSockNo).Accept requestID
    end sub我想让intSockNo++,一直加到integer的上限,然后再从1开始加大家有没有什么好办法阿,别太费资源
      

  6.   

    在收到ConnectionRequest的时候Load,然后用这个sock来connect。当这个连接断掉的时候unload。这样就不会浪费资源了。
      

  7.   

    to 楼上我也想在ConnectionRequest时Load不过winsock(Index)的Index怎么确定阿
      

  8.   

    如果客户端并不太多,楼上s的方法基本可行,如果客户端多的话,基本上不行。
    服务端最好不用vb写,如果一定要用,可以使用Activex服务器技术,并结合多端口
    指派的方法。
    我以前写的项目:节点大概有1000个左后,并发的大概有15个左后,按照楼上的传统做法
    效率很低(vb不支持真正的多线程),改成Activex,基本可行。
    注意:不要考虑用Createthread之类的api去写多线程程序经验之谈。
      

  9.   

    用一个控件数组,一个标志数组再加上通信协议(你自己的)就可以啊。如果没有猜错的话,客户和服务器都是你自己做的吧,最少也可以自己控制了。如果你想用tcp,那么首先你要实现握手。怎么实现握手呢,那就的你自己定义协议来完成了。
    首先要有一个winsock接受所有client发来的信息。因为你用tcp,就必须的设置remoteport和
    localport,因为作为server的接收端口是不可能在不停的变化的。而且你在client最初连接到server的时候也不可能知道一个不停变化着的remoteport。然后要有一个winsock(0).然后如果有连接请求,就load 一个winsock(n).
    然后把winsock(n)的设置发送给client,怎么发送,当然也是协议来规定了。
    这样就可以用新建的winsock(n)和client建立tcp连接了。如果系统检测到有一个或几个已经建立连接的winsock(n)停止连接了。就是说client走了。
    或因为某种原因,连接中断了,那么你就unload winsock(n).我之所以这样做,是为了更合理的利用系统资源。你可以用标志位来标志,序号为n的winsock已经被释放了,也就是说如果又有client请求连接,你又可以load winsock(n)了。怎么检测连接中断呢,用timer足够了。呵呵,这就是大体的思想了。具体的事还要你自己做了。
      

  10.   

    别人已说了很多,我也大体谈一下我的思路,权当交流:服务器端:
    两个WINSOCK,一个专门侦听,有固定端口号,例如:3000.别一个是WINSOCK数组,参数待设.客户端:
    一个WINSOCK.负责连接服务器.过程:
    当客户机登录时,向服务器端的固定端口(3000)发送一个请求连接,发送格式自定,服务器端收到该信号后,WINSOCK数组动态生成一个WINSOCK,分配一个未占用的端口号,将该端口号发送回申请的客户机,侦听WINSOCK重新置为侦听状态(为下一个客户提供服务),并将新生成的WINSOCK设置为侦听,客户机收到后,将收到的端口设置为WINSOCK的新端口号,并重新与服务器连接.
    该方法可实现一对多功能.类QQ.
      

  11.   

    但是我看用winsock控件数组的方式
    winsock(index) index 为integer型
    最大只能有32xxx
    但是我这里的连接数是不确定的
    ---------------------------------------
    什么?32XXX还不够吗?如果你的服务端真的同时(注意,是同时。)有这么多的连接,那我劝你趁早打消用vb的念头。
    但如果你的客户端并非同时连接上来,那么可以在某个客户端连上来的时候,就按顺序(一般是1025-65535)检测端口的状态,如果空闲就分配给它,如果端口忙就检测下一个端口,直到找到空闲的为止。而当客户端的操作完成以后,应该马上把它使用的那个端口关闭置闲,等待下一个客户端的连接。但总的来说,如果客户端一多起来,还是容易出问题。
      

  12.   

    MSTOP(CJH) 这位大哥的想法比较好,类似于ftp  中有控制连接、还有数据连接,确实高
      

  13.   


    "当客户机登录时,向服务器端的固定端口(3000)发送一个请求连接,发送格式自定,服务器端收到该信号后,WINSOCK数组动态生成一个WINSOCK,分配一个未占用的端口号,将该端口号发送回申请的客户机,侦听WINSOCK重新置为侦听状态(为下一个客户提供服务),并将新生成的WINSOCK设置为侦听,客户机收到后,将收到的端口设置为WINSOCK的新端口号,并重新与服务器连接.
    该方法可实现一对多功能.类QQ."
    请问:
        QQ中同时有上百万在线人数,服务器中端口号如何划分?(分配一个未占用的端口号,将该端口号发送回申请的客户机)