假设以下都是10M的HUB连接之局域网1、客户端Winsock控件使用UDP协议传输200K字节的字符串数据,服务器端用Winsock1_DataArrival事件接收:有无数据长度限制,若有是多少,固定还是可变的,会因什么而变,请回答尽量详细些。2、如果传送的数据较大,是否要分几个包传送,那么接收的Winsock1_DataArrival事件是在第一个包到来后响应还是全部数据包传送完毕最后响应。3、同上,如果多个客户端向服务器的同一端口在同一瞬间(注意假设就是并发同时传送到服务器的)传送数据,服务器端如何处理?是否因此而崩溃。4、同4,如果输入数据为200K,可能一个客户端数据要分多次传送,当第一个包传送完成第二包未来的及接收时,另外的计算机客户端数据到了(是传送到服务器同一端口的),服务器是先集中收未完成的那个数据之以完成还是丢掉这个数据转接收第二客户机的数据。这种情况会否有丢失数据可能。5、服务器上设置一个共享目录权限完全放开,80台工作站上的各有一程序用拷贝的方式同时向这个目录内拷贝入一个200K左右的文件;另一种情况是服务器和工作站都用Winsock控件的UDP协议,80台工作站同时向服务器一个相同端口如1000口传送这个200K的文件,请问两种情况哪种情况更可靠,哪种速度快。

解决方案 »

  1.   

    1 Winsock1_DataArrival 一次最多8k 
    2 Winsock1_DataArrival 每收到一次处理一次
    3 和4 其实一个问题 不会的 不同的客户段和服务器连接 用的是不同的winsock
    5 不知道
      

  2.   

    谢谢plmsoft的回答。那么:“服务器是先集中收未完成的那个数据之后再收那个插入来的客户信息,还是丢掉这个数据转接收第二客户机的数据”这个问题到底如何,这决定我的服务器如何把各个客户端发来的信息分别保存的。继续等候其它问题。
      

  3.   

    UDP协议 不肯定
    TCP/IP协议 不会丢掉数据的。还有如果不是一个客户 那么winsock 的是不一样的。
      

  4.   

    plmsoft你好,感谢再次回复,最后一句话我不明白。我是设置一个服务器,计算机名固定,相关代码如下:Private Sub Form_Load()
    Winsock1.Bind 1000 '梆定到本地计算机端口号
    End SubPrivate Sub Winsock1_DataArrival(ByVal bytesTotal As Long)'接收数据
    Dim p As String
    Winsock1.GetData p
    '以下为就可能超过8K字节数据进行分次读数据累计相加得到的字串
    '合并后一次性保存一台客户机传来的数据,这部分代码我以无误的写
    End Sub客户端数量有80个,各机相关代码完全相同,相关代码如下:Private Sub Form_Load()
    Winsock1.RemoteHost = "HOME" '服务器名
    Winsock1.RemotePort = 1000
    End Sub当客户端需要发送信息字串时使用
    Winsock1.SendData P_____________________那么,这80个客户端有可能部分计算机会同时并发向服务器发送超过8K的字节,我的本质问题就是以上代码是否可以实现服务器无数据遗漏的接收并保存,关键是可靠性是否够高.再次肯请plmsoft帮助分析.也肯请各位老师指点.谢谢.
      

  5.   

    可靠性的保证要靠自己的处理,不要仅仅依靠协议本身,udp协议本身就是丢包的
    问题简单回答
    1.
    缓存是8k 因此最大8k ,多了只有分包 但是个人建议  局域网采用4k-8k之间,互联网采用1-2k之间2.你要采用1的方法分包,当1个包全部到达时触发Winsock1_DataArrival 1个包就是你发送时的包
    3.不要考虑这个问题,他内部会排队的,听说并发是8个但是完全并发是不可能的
    4.丢失是有可能的因为你才用得是udp如果是tcp就不可能丢包因为它有自动找包机制,只要处理好,但是udp的话包的顺序有可能不是你发送的顺序 udp的话丢失的原因也是协议的原因
    5,还是不用winsock快,但是安全性还是winsock高
      

  6.   

    使用UDP解决这些问题所需要的方法太复杂,你应该使用TCP来传送,就没什么问题了。
      

  7.   

    '当然,下面两个你可以设置成复杂一点的,这样就不会丢失数据const SEND_SPLIT_START="<我的分割开始处>"
    const SEND_SPLIT_END="</我的分割结束处>"Private Sub Winsock1_DataArrival(Index As Integer, ByVal bytesTotal As Long)
    Dim bd() As Byte, s As String, t As String
    Me.Winsock1(Index).GetData bd, vbByte, bytesTotal
    s = VBA.StrConv(Me.Winsock1(Index).tag & CByte(bd), 64)
    Me.Winsock1(Index).tag = Me.Winsock1(Index).tag & CByte(bd)
    Dim a As Long, b As Long
    a = VBA.InStr(s, SEND_SPLIT_START): b = VBA.InStr(s, SEND_SPLIT_END)
    If a = 1 Then
        If b = 0 Then
            Exit Sub
        Else
            t = VBA.Right(s, VBA.Len(s) - VBA.Len(SEND_SPLIT_START))
            t = VBA.Left(t, b - VBA.Len(SEND_SPLIT_START) - 1)
            s = VBA.Right(s, VBA.Len(s) - b - VBA.Len(SEND_SPLIT_END) + 1)
            Me.Winsock1(Index).tag = VBA.StrConv(s, 128)
        End If
    End If
    End Sub