VB.NET套接字支持是否限制传入数据的大小?

时间:2015-07-02 14:41:53

标签: vb.net windows sockets tcp

我正在编写一种命令语言,用于在基于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套接字代码一般无法处理大量传入数据?

1 个答案:

答案 0 :(得分:0)

如果其他人偶然发现这个问题,我会报告答案:这是我自己的(基于Linux的)代码。客户端处理接收的速度比我在测试中遇到的要慢,这意味着我的输出缓冲区已满,而且我的一些写入失败并出现EAGAIN错误。不幸的是我没有处理这个错误,所以我的写入失败了,套接字被关闭了。

Mea culpa。