Basic example udp server and client ==================================== .. tab-set:: .. tab-item:: IPv4 AF_INET UDP * In this program, you are going to learn .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow * How to create a Socket ? .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow * How to bind a socket ? .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow * How to send a data ? .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow * How to recv a data ? .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow * How to use socket APIs ? * `socket `_ * `bind `_ * `sendto `_ * `recvfrom `_ .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow Topics in this section, * :ref:`program 1: udp single server and single client : single data transfer ` * :ref:`program 2: udp single server and single client : multiple data transfer ` .. _ipv4_af_inet_udp_single_data_transfer: .. tab-set:: .. tab-item:: program 1 : udp single server and single client : single data transfer .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow Topics in this section, * :ref:`IPV4 AF_INET UDP SOCKET FAQs ` * :ref:`Program1 : Step 1: Sequence Diagram for SERVER.c ` * :ref:`Program1 : Step 2: Program for Server.c ` * :ref:`Program1 : Step 3: Compile and Execute Server.c ` * :ref:`Program1 : Step 4: Sequence Diagram for CLIENT.c ` * :ref:`Program1 : Step 5: Program for Client.c ` * :ref:`Program1 : Step 6: Compile and Execute Client.c ` * :ref:`Summary ` .. _ipv4_af_inet_udp_multiple_data_transfer: .. tab-set:: .. tab-item:: program 2 : udp single server and single client : multiple data transfer .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow Topics in this section, * :ref:`IPV4 AF_INET UDP SOCKET FAQs ` * :ref:`Program2 : Step 1: Sequence Diagram for SERVER.c ` * :ref:`Program2 : Step 2: Program for Server.c ` * :ref:`Program2 : Step 3: Compile and Execute Server.c ` * :ref:`Program2 : Step 4: Sequence Diagram for CLIENT.c ` * :ref:`Program2 : Step 5: Program for Client.c ` * :ref:`Program2 : Step 6: Compile and Execute Client.c ` * :ref:`Summary ` .. _basic_example_ipv4_af_inet_udp_socket: .. tab-set:: .. tab-item:: IPV4 AF_INET UDP SOCKET : FAQs .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow Let us answer few basic questions in this socket .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow What does socket(AF_INET SOCK_DGRAM,IPPROTO_UDP) create? .. dropdown:: See Answer A UDP socket .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow What does AF_INET signify in socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)? .. dropdown:: See Answer IPv4 address family .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow Why might you choose SOCK_DGRAM when creating a socket? .. dropdown:: See Answer For connectionless communication .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow What is the purpose of IPPROTO_UDP in socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)? .. dropdown:: See Answer It is optional and can be omitted. .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow How does a UDP socket differ from a TCP socket created using socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)? .. dropdown:: See Answer UDP is connectionless, while TCP is connection-oriented, .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow What is the typical use case for a UDP socket created with socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)? .. dropdown:: See Answer DNS resolution .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow How would you bind a specific IP address and port to a UDP socket created using socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)? .. dropdown:: See Answer Use the bind() function after creating the socket. .. _program1_ipv4_af_inet_udp_socket_server_sequence_diagram: .. tab-set:: .. tab-item:: Program1 : Step 1: Sequence Diagram for SERVER.c .. plantuml:: @startuml !theme spacelab start :socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); :bind(server_socket, (struct sockaddr*)&server_addr, sizeof(server_addr)); :recvfrom(server_socket, buffer, BUFFER_SIZE, 0, (struct sockaddr *)&client_addr, &addr_size); :(void)close(server_socket); stop @enduml .. _program1_ipv4_af_inet_udp_socket_server_code: .. tab-set:: .. tab-item:: Program1: step 2: program for server.c * There are many functions used in socket. We can classify those functions based on functionalities. * Create Socket * Bind Socket * Recvfrom data_packet * Close socket * ``socket()`` is used to create a new socket. For example, .. code-block:: c server_socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); * ``bind()`` is used to associate the socket with a specific address and port. For example, .. code-block:: c ret = bind(server_socket, (struct sockaddr*)&server_addr, sizeof(server_addr)); * ``recvfrom`` is commonly used with UDP sockets, where communication is connectionless. it provides information about the source (sender) of the data, including the sender's IP address and port number. For example, .. code-block:: c len = recvfrom(server_socket, buffer, BUFFER_SIZE, 0, (struct sockaddr*)&client_addr, &addr_size); * ``close`` is used to close the socket To free up system resources associated with the socket. For example, .. code-block:: c (void)close(server_socket); * See the full program below, .. literalinclude:: single_data_transfer/server.c :language: c :emphasize-lines: 55, 56, 57, 70, 71, 72, 80, 81, 82, 83, 84, 94 .. _program1_ipv4_af_inet_udp_socket_server_side_compile_and_execute: .. tab-set:: .. tab-item:: Program1 : Step 3: Compile and Execute Server.c .. code-block:: c :linenos: :emphasize-lines: 1, 3 $ gcc -o server server.c $ sudo ./server 8080 Port: 8080 received: Hello from client! .. _program1_ipv4_af_inet_udp_socket_client_sequence_diagram: .. tab-set:: .. tab-item:: Program1 : Step 4: Sequence Diagram for CLIENT.c .. plantuml:: @startuml !theme spacelab start :socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); :sendto(client_socket, buffer, strlen(buffer), 0, (struct sockaddr*)&server_addr, sizeof(server_addr)); :(void)close(client_socket); stop @enduml .. _program1_ipv4_af_inet_udp_socket_client_code: .. tab-set:: .. tab-item:: Program1: step 5: program for client.c * There are many functions used in socket. We can classify those functions based on functionalities. * Create Socket * Sendto data_packet * Close socket * ``socket`` is used to create a new socket. For example, .. code-block:: c client_socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); * ``sendto`` is used to send the encoded message to the specified server address and port using a UDP socket. For example, .. code-block:: c ret = sendto(client_socket, buffer, strlen(buffer), 0, (struct sockaddr*)&server_addr, sizeof(server_addr)); * ``close`` is used to close the socket To free up system resources associated with the socket. For example, .. code-block:: c (void)close(client_socket); * See the full program below, .. literalinclude:: single_data_transfer/client.c :language: c :emphasize-lines: 75, 76, 77, 90, 91, 92, 93, 94, 105 .. _program1_ipv4_af_inet_udp_socket_client_side_compile_and_execute: .. tab-set:: .. tab-item:: Program1 : Step 6: Compile and Execute Client.c .. code-block:: c :linenos: :emphasize-lines: 1, 3 $ gcc -o client client.c $ sudo ./client 8080 127.0.0.1 Port: 8080 IP Address: 127.0.0.1 Messagesent: Hello from client! .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow $ sudo ./server 8080 127.0.0.1 $ sudo ./client 8080 127.0.0.1 program to run with elevated privileges, listen on port 8080, and bind to the loopback address 127.0.0.1. decided by the user based on the connection. .. _program2_ipv4_af_inet_udp_socket_server_sequence_diagram: .. tab-set:: .. tab-item:: Program2 : Step 1: Sequence Diagram for SERVER.c .. plantuml:: @startuml !theme spacelab start :socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); :bind(server_socket, (struct sockaddr*)&server_addr, sizeof(server_addr)); :i = 0; while (while (i < NUM_MESSAGES)) is (yes) :recvfrom(server_socket, buffer, BUFFER_SIZE, 0, (struct sockaddr*)&client_addr, &addr_size); :++i; endwhile :(void)close(server_socket); stop @enduml .. _program2_ipv4_af_inet_udp_socket_server_code: .. tab-set:: .. tab-item:: Program2 : step 2: program for server.c * There are many functions used in socket. We can classify those functions based on functionalities. * Create Socket * Bind Socket * Recvfrom data_packet * Close socket * ``socket()`` is used to create a new socket. For example, .. code-block:: c server_socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); * ``bind()`` is used to associate the socket with a specific address and port. For example, .. code-block:: c ret = bind(server_socket, (struct sockaddr*)&server_addr, sizeof(server_addr)); * ``recvfrom`` is commonly used with UDP sockets, where communication is connectionless. it provides information about the source (sender) of the data, including the sender's IP address and port number. For example, .. code-block:: c len = recvfrom(server_socket, buffer, BUFFER_SIZE, 0, (struct sockaddr*)&client_addr, &addr_size); * ``close`` is used to close the socket To free up system resources associated with the socket. For example, .. code-block:: c (void)close(server_socket); * See the full program below, .. literalinclude:: multiple_data_transfer/server.c :language: c :emphasize-lines: 56, 57, 58, 71, 72, 73, 86, 87, 88, 89, 90, 103 .. _program2_ipv4_af_inet_udp_socket_server_side_compile_and_execute: .. tab-set:: .. tab-item:: Program2 : Step 3: Compile and Execute Server.c .. code-block:: c :linenos: :emphasize-lines: 1, 3 $ gcc -o server server.c $ sudo ./server 8080 Port: 8080 Received: Message 1 from server! Received: Message 2 from server! Received: Message 3 from server! Received: Message 4 from server! Received: Message 5 from server! Received: Message 6 from server! Received: Message 7 from server! Received: Message 8 from server! Received: Message 9 from server! Received: Message 10 from server! .. _program2_ipv4_af_inet_udp_socket_client_sequence_diagram: .. tab-set:: .. tab-item:: Program2 : Step 4: Sequence Diagram for CLIENT.c .. plantuml:: @startuml !theme spacelab start :socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); :i = 0; while (while (i < NUM_MESSAGES)) is (yes) :sendto(client_socket, buffer, strlen(buffer), 0, (struct sockaddr*)&server_addr, sizeof(server_addr)); :++i; endwhile :(void)close(client_socket); stop @enduml .. _program2_ipv4_af_inet_udp_socket_client_code: .. tab-set:: .. tab-item:: Program2 : step 5: program for client.c * There are many functions used in socket. We can classify those functions based on functionalities. * Create Socket * Sendto data_packet * Close socket * ``socket`` is used to create a new socket. For example, .. code-block:: c client_socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); * ``sendto`` is used to send the encoded message to the specified server address and port using a UDP socket. For example, .. code-block:: c ret = sendto(client_socket, buffer, strlen(buffer), 0, (struct sockaddr*)&server_addr, sizeof(server_addr)); * ``close`` is used to close the socket To free up system resources associated with the socket. For example, .. code-block:: c (void)close(client_socket); * See the full program below, .. literalinclude:: multiple_data_transfer/client.c :language: c :emphasize-lines: 78, 79, 80, 99, 100, 101, 102, 115 .. _program2_ipv4_af_inet_udp_socket_client_side_compile_and_execute: .. tab-set:: .. tab-item:: Program2 : Step 6: Compile and Execute Client.c .. code-block:: c :linenos: :emphasize-lines: 1, 3 $ gcc -o client client.c $ sudo ./client 8080 127.0.0.1 Port: 8088 IP Address: 127.0.0.1 Message 1 sent: Message 1 from server! Message 2 sent: Message 2 from server! Message 3 sent: Message 3 from server! Message 4 sent: Message 4 from server! Message 5 sent: Message 5 from server! Message 6 sent: Message 6 from server! Message 7 sent: Message 7 from server! Message 8 sent: Message 8 from server! Message 9 sent: Message 9 from server! Message 10 sent: Message 10 from server! .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow $ sudo ./server 8080 127.0.0.1 $ sudo ./client 8080 127.0.0.1 program to run with elevated privileges, listen on port 8080, and bind to the loopback address 127.0.0.1. decided by the user based on the connection. .. tab-set:: .. tab-item:: Enhanced Socket Flexibility with ``AF_INET`` and ``PF_INET`` Domains .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow **Default Domain:** By default, the socket is configured to work in the ``AF_INET`` domain, handling all types of network data. **Additional Domain Support:** We expand the socket's capabilities to also function in the ``PF_INET`` domain, allowing it to operate similarly to ``AF_INET``. **Socket Creation:** We set up a network connection point known as a socket using ``socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)``. **Working Scenario:** Despite the change in domain to ``PF_INET``, the socket continues to operate the same way, handling general network data. .. _basic_example_ipv4_af_inet_udp_summary: .. tab-set:: .. tab-item:: Summary ============== ================================================================================================================== Socket API Learning ============== ================================================================================================================== socket Create a new socket bind Associate the socket with a specific address and port recvfrom It provides information about the source (sender) of the data, including the sender's IP address and port number. sendto Send the encoded message to the specified server address and port using a UDP socket. ============== ================================================================================================================== .. card:: See Also * Previous topic * :doc:`../../../sockets/ipv4_af_inet_tcp/epoll/epoll` * Current topic * :doc:`../../../sockets/ipv4_af_inet_udp/Basic_example/Basic_example` * Next topic * :doc:`../../../sockets/ipv4_af_inet_udp/select/select` * Other sockets * :doc:`../../../sockets/af_unix_tcp` * :doc:`../../../sockets/af_unix_udp` * :doc:`../../../sockets/ipv4_raw_af_inet_icmp` * :doc:`../../../sockets/ipv4_raw_af_inet_raw` * :doc:`../../../sockets/ipv4_raw_af_inet_tcp` * :doc:`../../../sockets/ipv4_raw_af_inet_udp` * :doc:`../../../sockets/ipv6_af_inet6_tcp` * :doc:`../../../sockets/ipv6_af_inet6_udp` * :doc:`../../../sockets/ipv6_raw_af_inet6_icmp` * :doc:`../../../sockets/ipv6_raw_af_inet6_tcp` * :doc:`../../../sockets/ipv6_raw_af_inet6_udp` * :doc:`../../../sockets/ipv6_raw_af_inet6_raw` * :doc:`../../../sockets/raw_af_packet_raw_htons_ETH_P_ALL` * :doc:`../../../sockets/raw_af_packet_tcp_htons_ETH_P_ALL` * :doc:`../../../sockets/raw_af_packet_udp_htons_ETH_P_ALL` * Other IPCs * :doc:`../../../Message_queues/Message_queues` * :doc:`../../../NamedPipes/NamedPipes` * :doc:`../../../Netlink/Netlink` * :doc:`../../../Shared_Memory/Shared_Memory` * :doc:`../../../Shared_Memory_2_FDS/Shared_Memory_2_FDS` * :doc:`../../../SocketPair/SocketPair` * :doc:`../../../Timerfd/Timerfd`