【问题标题】:RecieveBufferSize OutOfRangeException (.NET)RecieveBufferSize OutOfRangeException (.NET)
【发布时间】:2018-12-23 15:22:24
【问题描述】:

(在我开始之前,我知道这个标题很糟糕,如果有人能想到一个更好的名字,我会喜欢它)

我没有编程的想法,发现一个帖子列出了一些东西,所以我做了一个简单的本地聊天服务器。服务器运行良好,直到我尝试连接(通过 tcpClient)

来自客户端的代码如下:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    readData = "Connected."
    Msg()
    clientSocket.Connect("xxx.xxx.xx.xxx", 8888)
    serverStream = clientSocket.GetStream()

    Dim outStream As Byte() = Encoding.ASCII.GetBytes(TextBox1.Text & "$")
    serverStream.Write(outStream, 0, outStream.Length)
    serverStream.Flush()

    Dim ctThread As Threading.Thread = New Threading.Thread(AddressOf GetMessage)
    ctThread.Start()
End Sub

IP 是我的 IPV4 静态地址。

在服务器端:

Dim serverSocket As TcpListener = New TcpListener(ip, 8888)
    Dim clientSocket As TcpClient
    Dim counter As Integer = 0
    serverSocket.Start()
    Msg("Server started.")
    While (True)
        counter += 1
        clientSocket = serverSocket.AcceptTcpClient()

        Dim bytesFrom(10024) As Byte
        Dim dataFromClient As String

        Dim networkStream As NetworkStream = clientSocket.GetStream()
        networkStream.Read(bytesFrom, 0, CInt(clientSocket.ReceiveBufferSize))
        dataFromClient = Encoding.ASCII.GetString(bytesFrom)

        dataFromClient = dataFromClient.Substring(0, dataFromClient.IndexOf("$"))

        clientsList(dataFromClient) = clientSocket

        Msg(dataFromClient & "joined the server.")
        Dim client as new handleClient
        client.startClient(clientSocket, dataFromClient, clientsList)
    End While

当我尝试连接客户端时,服务器抛出this

我不明白为什么会这样。任何帮助将不胜感激。

【问题讨论】:

  • 1.请发布 full 堆栈跟踪 2。您的问题似乎与 stackoverflow.com/questions/23697819/… 非常相似
  • @Freggar erm 在编程方面,与其他人相比,我是一个新手。我如何获得完整的堆栈跟踪?
  • @David 检查this 然后this
  • @AhmedAbdelhameed 感谢您的帮助! :)
  • @David C# 也“使用”.Net 并且是 Microsoft 推动的主要语言,因此遗憾的是,您会发现 C# 代码比 VB.NET 更常见。您可以将代码转换器用于小代码 sn-ps,如该答案:carlosag.net/tools/codetranslator

标签: vb.net tcp tcpclient outofrangeexception


【解决方案1】:

这是不正确的:

networkStream.Read(bytesFrom, 0, CInt(clientSocket.ReceiveBufferSize))

ReceiveBufferSize 表示 TCP 套接字使用的 internal 缓冲区大小,您不应该在代码中使用它(也无需调用 CInt(),因为它已经一个整数)。

你已经有了自己的缓冲区,长度是你应该指定的:

networkStream.Read(bytesFrom, 0, bytesFrom.Length)

第三个参数表示在一次Read() 调用中可以接收的最大字节数。显然这不能超过缓冲区的长度,这就是为什么你需要准确地给出它(或者更小的值,如果你想读取更具体的字节数)。

【讨论】:

  • 这个问题是 bytesFrom 最初是'Dim-ed'不正确,Dim inStream() As Byte = New Byte((4096) - 1) {} plus 更改为 bytesFrom.length 解决了这个问题
  • @David:实际上不是。 Dim bytesFrom(10024) Byte 也是有效的语法,并且可以正常工作(尽管 10025 是一个相当奇怪的缓冲区大小)。无论如何,很高兴我能帮上忙!
  • 不,当我这样做时,它说 Byte() 无法转换为 Byte.. 这对我来说似乎很奇怪。可能是缓冲区大小的问题(我同意这很奇怪)
  • @David:我很好奇,发生在哪一行?因为这两种方式都是有效的语法。
  • 没关系。 >.> 我正在快速编程,并且在击键之间错误并没有消失。两者都有效
猜你喜欢
  • 2012-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-04
  • 1970-01-01
  • 2022-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多