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

33,344

Solution 1

  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.

Solution 2

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.

Share:
33,344
jokoon
Author by

jokoon

I first learned the basics of C by myself and a little help from friends, after that I learned C++ at school, php, MYSQL, and so on. I'm a big fan of the KISS principle, and https://en.wikipedia.org/wiki/Wirth%27s_law I don't like languages like java, C#, javascript, but am a big fan of python and C++ I'm interested in cartography, procedural generation, hardware.

Updated on January 31, 2020

Comments

  • jokoon
    jokoon over 4 years

    I can grasp the concept of TCP vs UDP, but still I don't know why are there 2 ways of sending UDP packets, and with that I still don't understand if this is absolutely necessary to bind() and accept()...