假设以下都是10M的HUB连接之局域网1、客户端Winsock控件使用UDP协议传输200K字节的字符串数据,服务器端用Winsock1_DataArrival事件接收:有无数据长度限制,若有是多少,固定还是可变的,会因什么而变,请回答尽量详细些。2、如果传送的数据较大,是否要分几个包传送,那么接收的Winsock1_DataArrival事件是在第一个包到来后响应还是全部数据包传送完毕最后响应。3、同上,如果多个客户端向服务器的同一端口在同一瞬间(注意假设就是并发同时传送到服务器的)传送数据,服务器端如何处理?是否因此而崩溃。4、同4,如果输入数据为200K,可能一个客户端数据要分多次传送,当第一个包传送完成第二包未来的及接收时,另外的计算机客户端数据到了(是传送到服务器同一端口的),服务器是先集中收未完成的那个数据之以完成还是丢掉这个数据转接收第二客户机的数据。这种情况会否有丢失数据可能。5、服务器上设置一个共享目录权限完全放开,80台工作站上的各有一程序用拷贝的方式同时向这个目录内拷贝入一个200K左右的文件;另一种情况是服务器和工作站都用Winsock控件的UDP协议,80台工作站同时向服务器一个相同端口如1000口传送这个200K的文件,请问两种情况哪种情况更可靠,哪种速度快。
解决方案 »
- 纯API创建COM组件,如何响应事件?
- 怎么老提示加载错误
- 如何判断控件是否存在?
- Printer.ScaleWidth ,Printer.Width有何区别?
- 如何知道已经编译成的 dll 文件里有什么函数声明???
- 求助:如何实现实时监控FTP服务器收到上传文件?
- 帮帮忙,我的毕业设计
- 在vb 中实现用对数坐标来画函数图象
- 如何用 Multimedia control 控件写光驱开关程序?
- 用我的打印预览控件可以轻松搞定,而且很简单、截面也完全个性化,并且是微软office风格
- 服务端程序采用 winsock 控件数组(使用TCP协议),多个用户(例如10个)同时发送请求给服务端程序,服务端程序是否可以同时响应10个用户
- 如何将listview的背景图片设置为拉伸?
2 Winsock1_DataArrival 每收到一次处理一次
3 和4 其实一个问题 不会的 不同的客户段和服务器连接 用的是不同的winsock
5 不知道
TCP/IP协议 不会丢掉数据的。还有如果不是一个客户 那么winsock 的是不一样的。
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帮助分析.也肯请各位老师指点.谢谢.
问题简单回答
1.
缓存是8k 因此最大8k ,多了只有分包 但是个人建议 局域网采用4k-8k之间,互联网采用1-2k之间2.你要采用1的方法分包,当1个包全部到达时触发Winsock1_DataArrival 1个包就是你发送时的包
3.不要考虑这个问题,他内部会排队的,听说并发是8个但是完全并发是不可能的
4.丢失是有可能的因为你才用得是udp如果是tcp就不可能丢包因为它有自动找包机制,只要处理好,但是udp的话包的顺序有可能不是你发送的顺序 udp的话丢失的原因也是协议的原因
5,还是不用winsock快,但是安全性还是winsock高
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