我正在编写一种命令语言,用于在基于Linux的盒子上的TCP套接字服务器上提供请求。该语言是简单的面向行的文本,因此人们可以使用它,但期望大多数查询都是自动化的。
特别是一个查询导致在一次突发中发回约600kB的(文本)数据。我测试过的所有Linux或OS X客户端都处理得很好。但是,我有一个客户在VB.NET / Windows开发,其应用程序无法立即接受该数据量。每次他的应用程序发出此查询时,它都会捕获返回数据的前78,822个字节,但之后会丢失其余数据。他尝试了许多不同的方法来提高限制,没有任何效果。 78,822的数字似乎非常一致,虽然我们无法弄清楚为什么(例如,它不是十六进制的好看)。
作为测试,我尝试使用Microsoft telnet client以及PuTTY在Win7上手动连接,并且两者都无法处理所有传入数据。虽然我不熟悉Microsoft工具,但这让我感到很惊讶; TCP客户端应该能够处理许多兆字节的数据。
这是他正在使用的代码(经许可发布):
Dim mySocket As Socket = Nothing
' Create a TCP/IP socket.
mySocket = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
mySocket.SendTimeout = 5000
mySocket.ReceiveTimeout = 10000
mySocket.Blocking = True
mySocket.ReceiveBufferSize = 8192
Dim intBytesRead As Integer = 0
Dim intTotBytes As Int32 = 0
Do While mySocket.Available > 0
Try
intBytesRead = mySocket.Receive(bytesReceived, intTotBytes, 8192, SocketFlags.None)
System.Threading.Thread.Sleep(1)
intTotBytes += intBytesRead
Catch exSocket As SocketException
If exSocket.ErrorCode = SocketError.WouldBlock OrElse _
exSocket.ErrorCode = SocketError.IOPending OrElse _
exSocket.ErrorCode = SocketError.NoBufferSpaceAvailable Then
System.Threading.Thread.Sleep(50)
ElseIf exSocket.ErrorCode = SocketError.TimedOut Then
Exit Do
Else
Throw exSocket
End If
Finally
End Try
Loop
(编辑:我忘了提到在有问题的情况下,代码通常在套接字抛出SocketError.TimedOut
异常时退出。)
作为一种解决方法,我已经重写了我的语言,允许一次只获取60kB的数据,而且他现在已经启动并运行了,但我仍然对这个限制感到担忧。
为什么这个代码或VB.NET套接字代码一般无法处理大量传入数据?
答案 0 :(得分:0)
如果其他人偶然发现这个问题,我会报告答案:这是我自己的(基于Linux的)代码。客户端处理接收的速度比我在测试中遇到的要慢,这意味着我的输出缓冲区已满,而且我的一些写入失败并出现EAGAIN错误。不幸的是我没有处理这个错误,所以我的写入失败了,套接字被关闭了。
Mea culpa。