RecieveBufferSize OutOfRangeException(.NET) [英] RecieveBufferSize OutOfRangeException (.NET)

查看:146
本文介绍了RecieveBufferSize OutOfRangeException(.NET)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

我耗尽了编写程序的想法,并找到了列出一些内容的帖子,因此我制作了一个简单的本地聊天服务器.服务器运行正常,直到我尝试连接(通过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

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

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

解决方案

这是不正确的:

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

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

您已经有自己的缓冲区,应该指定其长度:

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

第三个参数表示在一个Read()调用中可以接收的最大字节数.显然,这不能超过缓冲区的长度,这就是为什么您需要准确地指定它的长度(或者,如果要读取更特定数量的字节,则为较小的值).

(Before I start I know this title is awful if someone could think of a better name I'd love it)

I ran out of ideas to program, and found a post listing some things, so I made a simple local chat server. The server runs fine until I attempt to connect (via tcpClient)

The code from the client side is as follows:

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

Where the IP is my IPV4 static address.

On the server side:

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

When I attempt to connect the client, the server throws this

I do not understand why this is happening. Any assistance would be greatly appreciated.

解决方案

This is not correct:

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

ReceiveBufferSize represents the internal buffer size used by the TCP socket, you're not supposed to use that in your code (there's also no need to call CInt(), as it is already an Integer).

You already have your own buffer, which's length you are supposed to specify:

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

The third parameter indicates the maximum number of bytes that you can receive in one Read() call. Obviously this can't exceed your buffer's length, which is why you need to give it exactly that (or a smaller value, if you want to read a more specific amount of bytes).

这篇关于RecieveBufferSize OutOfRangeException(.NET)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆