Basic example ipv6 tcp server and client ========================================= .. tab-set:: .. tab-item:: IPv6 AF_INET6 TCP * 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 listen a socket ? .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow * How to connect a socket ? .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow * How to accept 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 `_ * `listen `_ * `connect `_ * `accept `_ * `send `_ * `recv `_ .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow Topics in this section, * :ref:`program 1: ipv6 tcp single server and single client : single data transfer ` * :ref:`program 2: ipv6 tcp single server and single client : multiple data transfer ` .. _ipv6_af_inet6_tcp_single_data_transfer: .. tab-set:: .. tab-item:: program 1 : ipv6 tcp 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:`IPV6 AF_INET6 TCP 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 ` .. _ipv6_af_inet6_tcp_multiple_data_transfer: .. tab-set:: .. tab-item:: program 2 : ipv6 tcp 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:`IPV6 AF_INET6 TCP 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 ` .. tab-set:: .. tab-item:: Enabling IPv6 on the Loopback Interface Before Program Execution .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow Before executing the program that relies on IPv6, enable the loopback interface for IPv6 using the following command: .. code-block:: c sudo sysctl -w net.ipv6.conf.lo.disable_ipv6=0 * This command sets the disable_ipv6 parameter to 0 for the loopback interface (lo), allowing IPv6 functionality. * Ensure to use this command cautiously and consider the implications, especially on production systems. * After enabling IPv6, proceed to execute your program that relies on IPv6 functionality. .. _basic_example_ipv6_af_inet6_tcp_socket: .. tab-set:: .. tab-item:: IPV6 AF_INET6 TCP 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_INET6, SOCK_STREAM, IPPROTO_TCP)`` do? .. dropdown:: See Answer This call creates a TCP socket in the ``AF_INET6`` (IPv6) address family. .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow When is it appropriate to use ``SOCK_STREAM`` with IPv6? .. dropdown:: See Answer For reliable, connection-oriented communication. .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow What privileges are required to create an IPv6 TCP socket? .. dropdown:: See Answer No special privileges. .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow Can ``socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP)`` be used for regular UDP communication? .. dropdown:: See Answer No, it is designed only for TCP communication. .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow How does an IPv6 TCP socket differ from an IPv4 TCP socket? .. dropdown:: See Answer IPv6 sockets handle communication using IPv6 addresses. .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow Can I use IPv6 TCP sockets in a mixed IPv4/IPv6 environment? .. dropdown:: See Answer Yes, most modern systems support IPv6. .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow How do I specify a port number for an IPv6 TCP socket? .. dropdown:: See Answer Set the port number in the sin6_port field. .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow Can I use IPv6 TCP sockets for non-blocking I/O? .. dropdown:: See Answer Yes, use setsockopt to enable non-blocking mode. .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow How do I handle connection establishment with IPv6 TCP sockets? .. dropdown:: See Answer Use the bind and listen functions. .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow Are there any compatibility issues with older systems when using IPv6 TCP sockets? .. dropdown:: See Answer Yes, older systems may lack IPv6 support. .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow How do I handle IPv6 DNS resolution in my application? .. dropdown:: See Answer Use functions like getaddrinfo to resolve hostnames. .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow How should you handle errors when using accept() in socket programming? .. dropdown:: See Answer Check the return value and handle errors appropriately .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow Why is it important to check the return value of send() and recv() in socket programming? .. dropdown:: See Answer It detects issues such as network errors or closed connections. .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow Can you use a TCP socket (SOCK_STREAM) for sending and receiving data concurrently between a client and server? .. dropdown:: See Answer Yes, TCP sockets support bidirectional communication. .. _program1_ipv6_af_inet6_tcp_socket_server_sequence_diagram: .. tab-set:: .. tab-item:: Program1 : Step 1: Sequence Diagram for SERVER.c .. plantuml:: @startuml !theme spacelab start :socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP); :bind(server_socket, (struct sockaddr*)&server_addr, sizeof(server_addr)); :listen(server_socket, 5); :client_socket = accept(server_socket, (struct sockaddr *)&client_addr, &addr_size); :send(client_socket, buffer, strlen(buffer), 0); :(void)close(client_socket); stop @enduml .. _program1_ipv6_af_inet6_tcp_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 * Listen Socket * Accept Socket * Send data_packet * Close socket * ``socket()`` is used to create a new socket. For example, .. code-block:: c server_socket = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP); * ``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)); * ``listen()`` is used to set up a socket to accept incoming connections. For example, .. code-block:: c ret = listen(server_socket, 5); * ``accept()`` is used in network programming on the server side to accept a connection request from a client. For example, .. code-block:: c client_socket = accept(server_socket, (struct sockaddr*)&client_addr, &addr_size); * ``send`` is used in network programming to send data over a connected socket. For example, .. code-block:: c ret = send(client_socket, buffer, strlen(buffer), 0); * ``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/server/server.c :language: c :emphasize-lines: 86, 87, 88, 95, 96, 97, 105, 113, 114, 115, 123, 124, 136, 137 .. _program1_ipv6_af_inet6_tcp_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 ::1 Port: 8080 IP Address: ::1 Message sent: Hello from server! .. _program1_ipv6_af_inet6_tcp_socket_client_sequence_diagram: .. tab-set:: .. tab-item:: Program1 : Step 4: Sequence Diagram for CLIENT.c .. plantuml:: @startuml !theme spacelab start :socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP); :connect(client_socket, (struct sockaddr*)&server_addr, sizeof(server_addr)); :recv(client_socket, buffer, BUFFER_SIZE, 0); :(void)close(client_socket); stop @enduml .. _program1_ipv6_af_inet6_tcp_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 * Connect Socket * Recv data_packet * Close socket * ``socket`` is used to create a new socket. For example, .. code-block:: c client_socket = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP); * ``connect`` is used in network programming to establish a connection from a client to a server. For example, .. code-block:: c ret = connect(client_socket, (struct sockaddr*)&server_addr, sizeof(server_addr)); * ``recv`` is used in network programming to receive data from a connected socket. For example, .. code-block:: c ret = recv(client_socket, buffer, BUFFER_SIZE, 0); * ``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/client.c :language: c :emphasize-lines: 81, 82, 83, 90, 91, 92, 100, 101, 112 .. _program1_ipv6_af_inet6_tcp_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 ::1 Port: 8080 IP Address: ::1 received = Hello from server! .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow $ sudo ./server 8080 ::1 $ sudo ./client 8080 ::1 program to run with elevated privileges, listen on port 8080, and bind to the loopback address ::1. decided by the user based on the connection. .. _program2_ipv6_af_inet6_tcp_socket_server_sequence_diagram: .. tab-set:: .. tab-item:: Program2 : Step 1: Sequence Diagram for SERVER.c .. plantuml:: @startuml !theme spacelab start :socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP); :bind(server_socket, (struct sockaddr*)&server_addr, sizeof(server_addr)); :listen(server_socket, 5); :client_socket = accept(server_socket, (struct sockaddr *)&client_addr, &addr_size); :i = 0; while (while (i < NUM_MESSAGES)) is (yes) :send(client_socket, buffer, strlen(buffer), 0); :recv(client_socket, buffer,sizeof(buffer), 0); :++i; endwhile :(void)close(client_socket); stop @enduml .. _program2_ipv6_af_inet6_tcp_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 * Listen Socket * Accept Socket * Send data_packet * Recv data_packet * Close socket * ``socket()`` is used to create a new socket. For example, .. code-block:: c server_socket = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP); * ``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)); * ``listen()`` is used to set up a socket to accept incoming connections. For example, .. code-block:: c ret = listen(server_socket, 5); * ``accept()`` is used in network programming on the server side to accept a connection request from a client. For example, .. code-block:: c client_socket = accept(server_socket, (struct sockaddr*)&client_addr, &addr_size); * ``send`` is used in network programming to send data over a connected socket. For example, .. code-block:: c ret = send(client_socket, buffer, strlen(buffer), 0); * ``recv`` is used in network programming to receive data from a connected socket. For example, .. code-block:: c ret = recv(client_socket, buffer, sizeof(buffer), 0); * ``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/server/server.c :language: c :emphasize-lines: 80, 81, 82, 95, 96, 97, 105, 113, 114, 115, 128, 129, 139, 140, 151, 152 .. _program2_ipv6_af_inet6_tcp_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 ::1 Port: 8080 IP Address: ::1 Received: Hello 1 from client! Received: Hello 2 from client! Received: Hello 3 from client! Received: Hello 4 from client! Received: Hello 5 from client! Received: Hello 6 from client! Received: Hello 7 from client! Received: Hello 8 from client! Received: Hello 9 from client! Received: Hello 10 from client! .. _program2_ipv6_af_inet6_tcp_socket_client_sequence_diagram: .. tab-set:: .. tab-item:: Program2 : Step 4: Sequence Diagram for CLIENT.c .. plantuml:: @startuml !theme spacelab start :socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP); :connect(client_socket, (struct sockaddr*)&server_addr, sizeof(server_addr)); :i = 0; while (while (i < NUM_MESSAGES)) is (yes) :recv(client_socket, buffer, BUFFER_SIZE, 0); :send(client_socket, buffer, strlen(buffer), 0); :++i; endwhile :(void)close(client_socket); stop @enduml .. _program2_ipv6_af_inet6_tcp_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 * Connect Socket * Recv data_packet * Send data_packet * Close socket * ``socket`` is used to create a new socket. For example, .. code-block:: c client_socket = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP); * ``connect`` is used in network programming to establish a connection from a client to a server. For example, .. code-block:: c ret = connect(client_socket, (struct sockaddr*)&server_addr, sizeof(server_addr)); * ``recv`` is used in network programming to receive data from a connected socket. For example, .. code-block:: c ret = recv(client_socket, buffer, BUFFER_SIZE, 0); * ``send`` is used in network programming to send data over a connected socket. For example, .. code-block:: c ret = send(client_socket, buffer, strlen(buffer), 0); * ``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/client.c :language: c :emphasize-lines: 76, 77, 78, 91, 92, 93, 102, 103, 117, 118, 128 .. _program2_ipv6_af_inet6_tcp_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 ::1 Port: 8080 IP Address: ::1 received : Hello 1 from server! received : Hello 2 from server! received : Hello 3 from server! received : Hello 4 from server! received : Hello 5 from server! received : Hello 6 from server! received : Hello 7 from server! received : Hello 8 from server! received : Hello 9 from server! received : Hello 10 from server! .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow $ sudo ./server 8080 ::1 $ sudo ./client 8080 ::1 program to run with elevated privileges, listen on port 8080, and bind to the loopback address ::1. decided by the user based on the connection. .. tab-set:: .. tab-item:: Enhanced Socket Flexibility with ``AF_INET6`` and ``PF_INET6`` 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_INET6`` domain, handling all types of network data. **Additional Domain Support:** We expand the socket's capabilities to also function in the ``PF_INET6`` domain, allowing it to operate similarly to ``AF_INET6``. **Socket Creation:** We set up a network connection point known as a socket using ``socket(PF_INET6, SOCK_STREAM, IPPROTO_TCP)``. **Working Scenario:** Despite the change in domain to ``PF_INET6``, the socket continues to operate the same way, handling general network data. .. _basic_example_ipv6_af_inet6_tcp_summary: .. tab-set:: .. tab-item:: Summary ============== ========================================================== Socket API Learning ============== ========================================================== socket Create a new socket bind Associate the socket with a specific address and port listen Set up a socket to accept incoming connections. connect Establish a connection from a client to a server. accept Server side to accept a connection request from a client. recv Receive data from a connected socket. send Send data over a connected socket. ============== ========================================================== .. card:: See Also * Previous topic * :doc:`../../../sockets/ipv4_raw_af_inet_udp/epoll/epoll` * Current topic * :doc:`../../../sockets/ipv6_af_inet6_tcp/Basic_example/Basic_example` * Next topic * :doc:`../../../sockets/ipv6_af_inet6_tcp/select/select` * Other sockets * :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`