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