我不是指如何连接到套接字.我应该了解UDP编程?
我需要担心套接字中的错误数据吗?
我应该假设如果我发送200字节,我可能分别得到120和60字节?
我是否应该担心另一个连接在同一端口上发送错误数据?
如果数据通常不会到达多长时间(通常)不能看到数据(250ms?1秒?1.75sec?)
我真的需要知道什么?
"我应该假设,如果我发送200字节,我可能分别得到120和60字节?"
当您发送UDP数据报时,您的读取大小将等于您的写入大小.这是因为UDP是数据报协议,而不是TCP的流协议.但是,在路由器将数据包分段或丢弃之前,您只能写入最大为MTU大小的数据.对于一般的互联网使用,安全MTU是576字节,包括标头.
"我应该担心另一个连接在同一个端口发送错误的数据?"
你没有连接,你有一个端口.您将收到发送到该端口的任何数据,无论它来自何处.由您来确定它是否来自正确的地址.
如果数据通常没有到达多长时间我(通常)看不到数据(250ms?1秒?1.75sec?)
数据可能永远丢失,数据可能会延迟,数据可能无序到达. 如果有任何困扰你,请使用TCP. 在UDP之上编写可靠的协议是一项非常重要的任务,几乎所有应用程序都没有理由这样做.
我是否应该担心另一个连接在同一端口上发送错误数据?
是的你应该担心它.任何应用程序都可以随时将数据发送到您的开放UDP端口.UDP的一个重要用途是多种到一种类型的通信,其中您使用在recvfrom
区分对等体期间传回的地址来复用与单个端口上的多个对等体的通信.
但是,如果要避免这种情况并且只接受来自单个对等方的数据包,则可以实际调用connect
UDP套接字.这会导致IP堆栈拒绝来自任何主机的数据包:端口组合(套接字)而不是您要与之通信的数据包.
调用connect
UDP套接字的第二个好处是,在许多操作系统中,它可以显着提高速度/延迟.当您调用sendto
未连接的UDP套接字时,操作系统实际上会临时连接套接字,发送数据然后断开套接字,从而增加了大量开销.
使用连接的UDP套接字的第三个优点是它允许您将ICMP错误消息接收回应用程序,例如路由或由于崩溃而未知的主机.如果没有连接UDP套接字,操作系统将不知道从网络向哪里发送ICMP错误消息,并将静默丢弃它们,可能导致您的应用程序在等待崩溃主机的响应时挂起(或等待您的选择超时).
您的数据包可能无法到达那里.
您的数据包可能会两次或更频繁地到达那里.
您的数据包可能没有整理.
您对基础网络层施加的数据包有大小限制.数据包大小可能非常小(可能是576字节).
这些都没有说"不要使用UDP".但是,您应该了解上述所有内容并考虑您可能想要采取的恢复选项.
碎片和重组在IP级别发生,因此您无需担心(维基百科).(这意味着您不会收到拆分或截断的数据包).
UDP数据包具有数据和标头的校验和,因此不太可能接收虚假数据,但这是可能的.丢包或重复包也是可能的.无论如何,你应该检查你的数据.
没有拥塞控制,所以你可能希望考虑一下,如果你计划用大量UDP数据包堵塞管道.