【问题标题】:UDPclient buffer too smallUDPclient 缓冲区太小
【发布时间】:2014-06-25 22:25:55
【问题描述】:

大家好,我正在开发一个需要通过 UDP 套接字发送图像的应用程序。我知道 TCP 是一个更好的协议,但是在 Java 中使用 Kryonet 我了解到 UDP 更适合这种类型的应用程序。我有我自己做的这个小班:

Imports System.Net.Sockets
Imports System.Net
Imports System.Text.Encoding

Public Class BasicUDPClient
    Event ClientMessageReceived(ByVal msg() As Byte)

    Public Property HostName As String = "localhost"
    Public Property Port As Integer = 8991

    Dim sender As New UdpClient(0)
    Dim receiver As New UdpClient(Port)
    Dim th_recv As New Threading.Thread(AddressOf Receive)
    Dim run As Boolean
    Dim ep As New IPEndPoint(System.Net.IPAddress.Any, 0)
    Public Sub New(ByVal host As String, ByVal port As Integer)
        HostName = host
        Me.Port = port
        receiver.Client.Blocking = False
        '10485760 = 10MB
        receiver.Client.ReceiveBufferSize = 10485760
        sender.Client.SendBufferSize = 10485760
        receiver.Client.ReceiveTimeout = 5000
        StartReceive()
    End Sub

    Public Sub SendString(ByVal msg As String)
        SendMessage(UTF8.GetBytes(msg))
    End Sub

    Public Sub SendMessage(ByVal msg() As Byte)
        sender.Connect(HostName, Port)
        sender.Send(msg, msg.Length)
    End Sub

    Public Sub StartReceive()
        run = True
        th_recv = New Threading.Thread(AddressOf Receive)
        th_recv.Start()
    End Sub

    Public Sub StopReceive()
        run = False
    End Sub

    Private Sub Receive()
        While (run)
            Try
                RaiseEvent ClientMessageReceived(receiver.Receive(ep))
            Catch ex As Exception
                Debug.WriteLine("Error: " & ex.Message)
            End Try

        End While
    End Sub

End Class

它适用于像你好这样的字符串,但是当我发送图像时,大约 200000-150000 字节我收到一个错误,说缓冲区低于数据包的内容(我可以发布错误消息的图像,但我的 .net 语言是西班牙语)

谢谢

【问题讨论】:

    标签: vb.net sockets udp udpclient


    【解决方案1】:
    1. 使用 UDP,您不能发送大于 64KB 的消息。使用 TCP,或者自己将负载拆分为多条消息,这将非常复杂,因为消息可能会丢失。
    2. ReceiveBufferSize 不是您想的那样。使用它几乎无济于事。
    3. 发送者和接收者的代码丢失,但sender.Connect 看起来很奇怪,因为 UDP 是无连接的。

    【讨论】:

    • 所以,发送它的唯一方法是分割图像,不是吗?
    • 此评论的答案在项目符号 1 中给出。不确定要添加什么。有什么具体问题吗?
    • @KePimbo:UDP 是面向消息的,消息可以容纳的字节数是有限的。 TCP 是面向流的,没有这个限制。所以是的,在使用 UDP 时,您必须将大数据拆分为较小的消息。有一些协议(例如 TFTP)可以为您处理这些问题。
    • @usr: Connect() 在 UDP 中有意义。就像在 TCP 中一样,它在本地和远程 IP/端口对之间创建关联。这样做的一个好处是,“已连接”的 UDP 套接字可以报告基于 ICMP 的错误,例如“无法访问目标端口”,而“未连接”的 UDP 套接字则无法获得这些错误,您必须使用 RAW 套接字接收它们(并且有管理限制)。
    猜你喜欢
    • 2011-05-26
    • 1970-01-01
    • 2016-09-22
    • 1970-01-01
    • 2010-12-03
    • 1970-01-01
    • 2013-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多