What's the purpose of using sendto()/recvfrom() instead of connect()/send()/recv() with UDP sockets?

  1. accept() is for TCP. It has nothing to do with UDP.

  2. connect() in UDP doesn't do anything to the other end, it just conditions the local API to know who you are sending to and receiving from.

  3. If you don't already know that, or don't care, or want to send to multiple destinations with the same socket, you don't use connect(), you use sendto() instead. Similarly for receiving.

    Consider a UDP server for example. It would call recvfrom(), so it would get the source address information, process the request, create the response, and send it to that address via sendto(). No connect() involved anywhere, ergo not possible to use either send() or recv().

  4. It is only necessary to bind() a server, because the clients need a fixed port number to send to. A client needn't bind() at all: an automatic bind() will take place on the first send()/sendto()/recv()/recvfrom() using a system-assigned local port number.


It is important to understand that TCP is connection-oriented, while UDP is a connectionless protocol.

  • TCP: You need to connect first prior to sending/receiving data to/from a remote host.
  • UDP: No connection is required. You can send/receive data to/from any host.

You will normally use sendto() on UDP socket in order to specify the destination. Similarly, you would normally use recvfrom() to know where the UDP data was received from.

However, you can actually use connect() on UDP socket as an option. In that case, you can use send()/recv() on the UDP socket to send data to the address specified with the connect() and to receive data only from the address. (The connect() on UDP socket merely sets the default peer address and you can call connect() on UDP socket as many times as you want, and the connect() on UDP socket, of course, does not perform any handshake for connection.)

Hope this helps.