首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RecieveBufferSize OutOfRangeException (.NET)

RecieveBufferSize OutOfRangeException (.NET)
EN

Stack Overflow用户
提问于 2018-07-16 06:24:14
回答 1查看 266关注 0票数 0

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

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

客户端的代码如下:

代码语言:javascript
复制
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静态地址。

在服务器端:

代码语言:javascript
复制
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

我不明白为何会出现这种情况。如能提供任何协助,将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-16 08:19:36

这是不正确的:

代码语言:javascript
复制
networkStream.Read(bytesFrom, 0, CInt(clientSocket.ReceiveBufferSize))

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

您已经有了自己的缓冲区,需要指定的长度是:

代码语言:javascript
复制
networkStream.Read(bytesFrom, 0, bytesFrom.Length)

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51355713

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档