UDP(4P)

NAME
udp - Internet User Datagram Protocol

SYNOPSIS
#include <sys/socket.h>
#include <netinet/in.h>

s = socket(AF_INET, SOCK_DGRAM, 0);

DESCRIPTION

UDP is a simple, unreliable datagram protocol which is used to support the SOCK_DGRAM abstraction for the Internet protocol family. It is layered directly above the Internet Protocol (IP). UDP sockets are connectionless, and are normally used with the sendto, sendmsg, recvfrom, and recvmsg system calls (see send(2) and recv(2)). If the connect(2) system call is used to fix the destination for future packets, then the recv(2) or read(2V) and send(2) or write(2V) system calls may be used.

UDP address formats are identical to those used by the Transmission Control Protocol (TCP). Like TCP, UDP uses a port number along with an IP address to identify the endpoint of communication. Note: the UDP port number space is separate from the TCP port number space (that is, a UDP port may not be “connected” to a TCP port). The bind(2) system call can be used to set the local address and port number of a UDP socket. The local IP address may be left unspecified in the bind call by using the special value INADDR_ANY. If the bind call is not done, a local IP address and port number will be assigned to each packet as it is sent. Broadcast packets may be sent (assuming the underlying network supports this) by using a reserved “broadcast address”; this address is network interface dependent. Broadcasts may only be sent by the super-user.

Options at the IP level may be used with UDP; see ip(4P).

There are a variety of ways that a UDP packet can be lost or discarded, including a failure of the underlying communication mechanism. UDP implements a checksum over the data portion of the packet. If the checksum of a received packet is in error, the packet will be dropped with no indication given to the user. A queue of received packets is provided for each UDP socket. This queue has a limited capacity. Arriving datagrams which will not fit within its high-water capacity are silently discarded.

UDP processes Internet Control Message Protocol (ICMP) error messages received in response to UDP packets it has sent. See icmp(4P). ICMP “source quench” messages are ignored. ICMP “destination unreachable,” “time exceeded” and “parameter problem” messages disconnect the socket from its peer so that subsequent attempts to send packets using that socket will return an error. UDP will not guarantee that packets are delivered in the order they were sent. As well, duplicate packets may be generated in the communication process.

ERRORS
A socket operation may fail if:

EISCONN
    A connect operation was attempted on a socket on which a connect operation had already been performed, and the socket could not be successfully disconnected before making the new connection.

EISCONN
    A sendto or sendmsg operation specifying an address to which the message should be sent was attempted on a socket on which a connect operation had already been performed.

ENOTCONN
    A send or write operation, or a sendto or sendmsg operation not specifying an address to which the message should be sent, was attempted on a socket on which a connect operation had not already been performed.

EADDRINUSE
    A bind operation was attempted on a socket with a network address/port pair that has already been bound to another socket.

EADDRNOTAVAIL
    A bind operation was attempted on a socket with a network address for which no network interface exists.

EINVAL
    A sendmsg operation with a non-NULL msg_accrights was attempted.

EACCES
    A bind operation was attempted with a “reserved” port number and the effective user ID of the process was not super-user.

ENOBUFS
    The system ran out of memory for internal data structures.

SEE ALSO
bind(2), connect(2), read(2V), recv(2), send(2), write(2V), icmp(4P), inet(4F), ip(4P), tcp(4P)

Postel, Jon, User Datagram Protocol, RFC 768, Network Information Center, SRI International, Menlo Park, Calif., August 1980. (Sun 800-1054-01)

BUGS

SIOCSHIWAT and SIOCGHIWAT ioctl's to set and get the high water mark for the socket queue, and so that it can be changed from 2048 bytes to be larger or smaller, have been defined (in sys/ioctl.h) but not implemented.

Something sensible should be done with ICMP source quench error messages if the socket is bound to a peer socket.