我最开始做socket客户端和服务器端程序.客户端上传文件到服务端.
因为要求服务器端的代码是不可以总变的,也不可以总进行重新启动.所以只好做成dll或者服务形式的.现在又要实现客户端下载服务器文件功能.请大家看看我的想法对么?
如果客户端要实现下载功能,那么当客户端启动时,就开始监听相关的端口.当需要"下载"这个功能时,就通过客户端一个socket将相应数据传给服务器端,然后服务器端代码设置一个新的socket来准备进行文件传送.服务器端怎样来调用一个新的socket呢?定义一个新的socket就可以了么(dim 变量 as winsock??)?

解决方案 »

  1.   

    1 客户端是如何知道需要下载的?是通过服务段消息吗?2 当可以要下载时,可以向服务端发消息。然后,服务端回传数据就是了。3 各个客户应该是在请求连接时,由服务 Load 一个该客户所属的 Winsock 控件数组成员。过程如下:
    a 服务侦听一个 Winsock 控件数组成员0。
    b 当有客户请求连接时,如果允许连接,服务就 Load 一个新的控件数组成员,并记录对应的客户名。以后与该客户的所有数据交换都通过它。
    c 当客户发回退出消息时,卸载对应的控件数组成员。
      

  2.   

    谢谢of123() 啊.
    1,客户端的下载就是通过一个界面的按钮下载(是用户本身知道该下载哪个文件).
    2,主要我就是怕建立这个连接的过程中出错.如果client端还好,要是服务端,不能每次都让用户去服务端重新启动这个服务呀.对吧?
    3,我所做的,每次client端打开时,都会向server端发送请求,来建立2端的socket的连接(因为我只做了上传功能,所以两端的设置暂时按照上传的设置写的)
    我在server端sckMain_ConnectionRequest这里,每当接收到client端的链接,都会产生一个新的winsock,也就是我把这个sckMain设成数组的方式了.
    不过这里我不太清楚,什么时候应该将产生的socket释放呢?当client端退出的时候么?
      

  3.   

    Private Sub sckMain_ConnectionRequest(index As Integer, ByVal requestID As Long)If index = 0 Then
        For i = 1 To 300
            If MArr(i, 0) = "" Then
                pi = i
                bi = True
                Exit For
            End If
        Next i    If bi = True Then
            MArr(pi, 0) = sckMain(0).RemoteHostIP
            Load sckMain(pi)
            sckMain(pi).LocalPort = 10000 + pi
            sckMain(pi).Accept requestID
        Else
            'Debug.Print "客户端连接已满"
            sckMain(pi).SendData "mainf"
        End If
    End IfEnd Sub
    这是是按照影子大哥的写法,来写的.可能有写地方我还不是太了解.
    MArr(pi, 0) = sckMain(0).RemoteHostIP'这里就是接收连接用户的ip地址,对么?
    Load sckMain(pi)'这里是产生一个新的socket?
    sckMain(pi).LocalPort = 10000 + pi'这里是sckMain(pi)分配的新的port么?那么这些都产生了,还要返回给客户端sckmain的localport么?client端就给产生的localport发数据就可以了?