IPV4 RAW AF INET TCP server client program with Select system call ==================================================================== .. tab-set:: .. tab-item:: IPv4 RAW_AF_INET 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 write a data ? .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow * How to read a data ? .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow * How to use socket APIs ? * `socket `_ * `write `_ * `read `_ .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow Topics in this section, * :ref:`IPV4 RAW_AF_INET TCP SOCKET FAQs ` * :ref:`Step 1: Sequence Diagram for SERVER.c ` * :ref:`Step 2: Program for Server.c ` * :ref:`Step 3: Compile and Execute Server.c ` * :ref:`Step 4: Sequence Diagram for CLIENT.c ` * :ref:`Step 5: Program for Client.c ` * :ref:`Step 6: Compile and Execute Client.c ` * :ref:`Summary ` .. _select_ipv4_raw_af_inet_tcp_socket: .. tab-set:: .. tab-item:: IPV4 RAW_AF_INET 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_INET, SOCK_RAW, IPPROTO_TCP)`` do? .. dropdown:: See Answer This call creates a raw socket in the ``AF_INET`` address family for direct access to TCP packets. .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow When is it appropriate to use ``SOCK_RAW`` sockets with TCP? .. dropdown:: See Answer It's suitable for tasks like packet capturing, network monitoring, or implementing custom protocols where direct access to TCP packets is needed. .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow Can this socket be used for regular TCP communication? .. dropdown:: See Answer While technically possible, it's not recommended for regular communication due to increased complexity and potential security risks. .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow How does a raw TCP socket differ from a regular TCP socket? .. dropdown:: See Answer A raw TCP socket provides direct access to the TCP layer, allowing for manual packet manipulation, whereas regular TCP sockets handle packet details internally. .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow What are some use cases for raw TCP sockets? .. dropdown:: See Answer Use cases include network sniffing, packet analysis, security auditing, and developing custom network protocols. .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow How can I capture and analyze TCP packets using raw sockets? .. dropdown:: See Answer You can use the raw socket to capture TCP packets and analyze them using packet analysis tools like Wireshark. .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow Is error checking needed after creating the socket? .. dropdown:: See Answer Yes, checking for errors ensures that the socket is created successfully before proceeding with further operations. .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow Why is it important to check the return value of read() and write() 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 What is the purpose of the select system call in network programming? .. dropdown:: See Answer To block and wait for activity on one or more file descriptors. .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow How does select help in handling multiple sockets efficiently? .. dropdown:: See Answer It provides a way to wait for readiness on multiple sockets without blocking the entire program. .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow What types of file descriptors can be monitored using select? .. dropdown:: See Answer sockets, files, timerfd, socketpair, message_queue, Namedpipes and shared_memory. .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow What is the significance of the timeout parameter in the select function? .. dropdown:: See Answer It specifies the maximum duration to wait for any file descriptor to become ready. .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow How do you handle errors when using the select system call? .. dropdown:: See Answer Check the return value for -1 to detect errors, Use perror to print error messages. .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow How does select handle a set of file descriptors with different states (e.g., reading, writing, exception)? .. dropdown:: See Answer Preparing File Descriptor Sets: ``select(readfds, writefds, exceptfds);`` Setting Up Readiness Conditions: If you are interested in monitoring file descriptors for readability, you add them to the readfds set. ``FD_ZERO(&readfds);`` ``FD_SET(fd1, &readfds);`` Setting Up Writability Conditions: If you are interested in monitoring file descriptors for writability, you add them to the writefds set. ``FD_ZERO(&writefds);`` ``FD_SET(fd2, &writefds);`` Setting Up Exceptional Conditions: If you are interested in monitoring file descriptors for exceptional conditions, you add them to the exceptfds set. ``FD_ZERO(&exceptfds);`` ``FD_SET(fd3, &exceptfds);`` .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow How does select Checking Ready File Descriptors? .. dropdown:: See Answer After select returns, you can check the sets to determine which file descriptors are ready for the specified conditions. .. code-block:: c if (FD_ISSET(fd1, &readfds)) { // fd1 is ready for reading } if (FD_ISSET(fd3, &writefds)) { // fd2 is ready for writing } if (FD_ISSET(fd4, &exceptfds)) { // fd3 has an exceptional condition } .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow What does it mean if select returns 0? .. dropdown:: See Answer No file descriptors are ready within the specified timeout. .. _select_ipv4_raw_af_inet_tcp_socket_server_sequence_diagram: .. tab-set:: .. tab-item:: Step 1: Sequence Diagram for SERVER.c .. plantuml:: @startuml !theme spacelab start :socket(AF_INET, SOCK_RAW, IPPROTO_TCP); :bind(sock_fd, (struct sockaddr *)servaddr, sizeof(struct sockaddr_in)); :connect(sock_fd, (struct sockaddr*)client_addr, sizeof(struct sockaddr_in)); while (while(1)) is (yes) :FD_ZERO(&read_fds); :FD_SET(sock_fd, &read_fds); :select(sock_fd + 1, &read_fds, NULL, NULL, NULL); if (FD_ISSET(sock_fd, &read_fds)) then (yes) :read(sock_fd, recvbuffer, sizeof(recvbuffer)); :write(sock_fd, buffer, sizeof(buffer)); else (no) endif endwhile (CTRL+c) :(void)close(sock_fd); stop @enduml .. _select_ipv4_raw_af_inet_tcp_socket_server_code: .. tab-set:: .. tab-item:: 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 * Connect Socket * Select * Write data_packet * Read data_packet * Close socket * ``socket()`` is used to create a new socket. For example, .. code-block:: c sock_fd = socket(AF_INET, SOCK_RAW, IPPROTO_TCP); * ``bind()`` is used to associate the socket with a specific address and port. For example, .. code-block:: c ret = bind(sock_fd, (struct sockaddr*)servaddr, sizeof(struct sockaddr_in)); * ``connect()`` is used in network programming to establish a connection from a client to a server. For example, .. code-block:: c ret = connect(sock_fd, (struct sockaddr*)client_addr, sizeof(struct sockaddr_in)); * ``select()`` is used in network programming to monitor multiple file descriptors (usually sockets) for read, write, or error conditions. For example, .. code-block:: c ret = select(sock_fd + 1, &read_fds, NULL, NULL, NULL); * ``read`` system call in C is commonly used to read data from a file descriptor, such as a socket. .. code-block:: c ret = read(sock_fd, recvbuffer, sizeof(recvbuffer)); * ``write`` system call in C is used to write data to a file descriptor, such as a socket. .. code-block:: c ret = write(sock_fd, buffer, sizeof(buffer)); * ``close`` is used to close the socket To free up system resources associated with the socket. For example, .. code-block:: c (void)close(sock_fd); * See the full program below, .. literalinclude:: ipv4_raw_af_inet_tcp/server/server.c :language: c :emphasize-lines: 114, 115, 116, 136, 137, 138, 159, 160, 161, 226, 227, 239, 240, 257, 258, 272 .. _select_ipv4_raw_af_inet_tcp_socket_server_side_compile_and_execute: .. tab-set:: .. tab-item:: Step 3: Compile and Execute server.c .. code-block:: c :emphasize-lines: 1, 3 $ gcc -o server server.c $ sudo ./server 127.0.0.1 IP Address: 127.0.0.1 IP Address: 127.0.0.1 checksum is c945 Received : Hello server Received : Hello server Received : Hello server Received : Hello server Received : Hello server Received : Hello server Received : Hello server Received : Hello server Received : Hello server Received : Hello server Received : Hello server Received : Hello server Received : Hello server Received : Hello server ^C .. _select_ipv4_raw_af_inet_tcp_socket_client_sequence_diagram: .. tab-set:: .. tab-item:: Step 4 : Sequence Diagram for CLIENT.c .. plantuml:: @startuml !theme spacelab start :socket(AF_INET, SOCK_RAW, IPPROTO_TCP); :bind(sockfd, (struct sockaddr*)clientaddr, sizeof(struct sockaddr_in)); :connect(sockfd, (struct sockaddr*)serveraddr, sizeof(struct sockaddr_in)); while (while(1)) is (yes) :write(sockfd, buffer, sizeof(buffer)); :FD_ZERO(&read_fds); :FD_SET(sockfd, &read_fds); :select(sockfd + 1, &read_fds, NULL, NULL, NULL); if (FD_ISSET(sockfd, &read_fds)) then (yes) :read(sockfd, recvbuffer, sizeof(recvbuffer)); else (no) endif endwhile (CTRL+c) :(void)close(sockfd); stop @enduml .. _select_ipv4_raw_af_inet_tcp_socket_client_code: .. tab-set:: .. tab-item:: Step 5: program for client.c * There are many functions used in socket. We can classify those functions based on functionalities. * Create Socket * Bind Socket * Connect Socket * Select * Write data_packet * Read data_packet * Close socket * ``socket`` is used to create a new socket. For example, .. code-block:: c sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_TCP); * ``bind()`` is used to associate the socket with a specific address and port. For example, .. code-block:: c ret = bind(sockfd, (struct sockaddr*)clientaddr, sizeof(struct sockaddr_in)); * ``connect()`` is used in network programming to establish a connection from a client to a server. For example, .. code-block:: c ret = connect(sockfd, (struct sockaddr*)serveraddr, sizeof(struct sockaddr_in)); * ``select`` is used in network programming to monitor multiple file descriptors (usually sockets) for read, write, or error conditions. For example, .. code-block:: c ret = select(sockfd + 1, &read_fds, NULL, NULL, NULL); * ``read`` system call in C is commonly used to read data from a file descriptor, such as a socket. .. code-block:: c ret = read(sockfd, recvbuffer, sizeof(recvbuffer)); * ``write`` system call in C is used to write data to a file descriptor, such as a socket. .. code-block:: c ret = write(sockfd, buffer, sizeof(buffer)); * ``close`` is used to close the socket To free up system resources associated with the socket. For example, .. code-block:: c (void)close(sockfd); * See the full program below, .. literalinclude:: ipv4_raw_af_inet_tcp/client/client.c :language: c :emphasize-lines: 112, 113, 114, 134, 135, 136, 156, 157, 158, 223, 224, 234, 235, 247, 248, 273 .. _select_ipv4_raw_af_inet_tcp_socket_client_side_compile_and_execute: .. tab-set:: .. tab-item:: Step 6: Compile and Execute client.c .. code-block:: c :emphasize-lines: 1, 3 $ gcc -o client client.c $ sudo ./client 127.0.0.1 IP Address: 127.0.0.1 IP Address: 127.0.0.1 checksum is c135 Received : Hello client Received : Hello client Received : Hello client Received : Hello client Received : Hello client Received : Hello client Received : Hello client Received : Hello client Received : Hello client Received : Hello client Received : Hello client Received : Hello client Received : Hello client ^C .. 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_RAW, IPPROTO_TCP)``. **Working Scenario:** Despite the change in domain to ``PF_INET``, the socket continues to operate the same way, handling general network data. .. _select_ipv4_raw_af_inet_tcp_Summary: .. tab-set:: .. tab-item:: Summary ============== ================================================================================================================== Socket API Learning ============== ================================================================================================================== socket Create a new socket select Monitor multiple file descriptors (usually sockets) for read, write, or error conditions. write used to write data to a file descriptor, such as a socket. read used to read data from a file descriptor, such as a socket. ============== ================================================================================================================== .. card:: See Also * Previous topic * :doc:`../../../sockets/ipv4_raw_af_inet_tcp/Basic_example/Basic_example` * Current topic * :doc:`../../../sockets/ipv4_raw_af_inet_tcp/select/select` * Next topic * :doc:`../../../sockets/ipv4_raw_af_inet_tcp/poll/poll` * Other sockets * :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`