af_packet raw server client program with Select system call ============================================================= .. tab-set:: .. tab-item:: AF_PACKET RAW * 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 `_ * `send `_ * `recv `_ .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow Topics in this section, * :ref:`AF_PACKET RAW 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_af_packet_raw_socket: .. tab-set:: .. tab-item:: AF_PACKET RAW 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_PACKET, SOCK_RAW, htons(ETH_P_ALL))`` do? .. dropdown:: See Answer This call creates a raw socket at the data link layer, allowing capturing of all Ethernet frames, including those not destined for the local host. .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow How can I handle errors when creating a raw socket for packet capturing? .. dropdown:: See Answer Check the return value of the ``socket`` function. If it returns -1, use ``perror`` to print a descriptive error message. .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow Are there specific privileges required to create a raw packet socket? .. dropdown:: See Answer Yes, typically, root or superuser privileges are required to create a raw packet socket for security reasons. .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow What kind of errors can occur when using a raw packet socket? .. dropdown:: See Answer Common errors include permission-related errors (EACCES), socket creation failures (ENOMEM), or invalid arguments (EINVAL). .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow How do I handle errors when binding a raw packet socket? .. dropdown:: See Answer Check the return value of the ``bind`` function. If it returns -1, handle the error by printing a message or taking appropriate corrective action based on the error code. .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow What is the significance of error code ``EPERM`` when dealing with raw packet sockets? .. dropdown:: See Answer ``EPERM`` (Operation not permitted) typically indicates insufficient privileges. Ensure the program has the necessary permissions to create raw packet sockets. .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow How do I handle errors when using ``recv`` and ``send`` to capture packets and send packets with a raw socket? .. dropdown:: See Answer Check the return value of ``recv`` and ``send``. If it returns -1, handle the error by printing a message or taking appropriate corrective action. .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow Is it important to close the raw packet socket on error? .. dropdown:: See Answer Yes, closing the socket is crucial to release system resources. Always follow error-handling best practices and close sockets on error. .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow How do I handle timeouts when capturing packets with a raw packet socket? .. dropdown:: See Answer For timeouts, use ``select`` or ``poll`` in combination with non-blocking mode to wait for data with a specified timeout. .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow Is it possible to capture packets on a specific network interface with a raw packet socket? .. dropdown:: See Answer Yes, use the ``bind`` function to associate the raw packet socket with a specific network interface. .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow How do I handle errors related to socket file descriptor management? .. dropdown:: See Answer When closing sockets, check for errors using ``close``. Handle errors by printing messages or taking corrective actions. .. 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_af_packet_raw_socket_server_sequence_diagram: .. tab-set:: .. tab-item:: Step 1: Sequence Diagram for SERVER.c .. plantuml:: @startuml !theme spacelab start :socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL)); :bind(server_socket, (struct sockaddr*)&server_addr, sizeof(server_addr)); while (while(1)) is (yes) :FD_ZERO(&read_fds); :FD_SET(server_socket, &read_fds); :select(server_socket + 1, &read_fds, NULL, NULL, NULL); if (FD_ISSET(server_socket, &read_fds)) then (yes) :recv(server_socket, buffer, BUFFER_SIZE, 0); :send(server_socket, buffer, BUFFER_SIZE, 0); else (no) endif endwhile (CTRL+c) :(void)close(server_socket); stop @enduml .. _select_af_packet_raw_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 * Select * Recv data_packet * Send data_packet * Close socket * ``socket()`` is used to create a new socket. For example, .. code-block:: c server_socket = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL)); * ``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)); * ``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(server_socket + 1, &read_fds, NULL, NULL, NULL); * ``recv`` is used in network programming to receive data from a connected socket. For example, .. code-block:: c len = recv(server_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(server_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(server_socket); * See the full program below, .. literalinclude:: raw_af_packet_raw_htons_ETH_P_ALL/server/server.c :language: c :emphasize-lines: 46, 47, 48, 63, 64, 65, 82, 83, 94, 95, 108, 109, 122 .. _select_af_packet_raw_socket_server_side_compile_and_execute: .. tab-set:: .. tab-item:: Step 3: Compile and Execute Server.c .. code-block:: c :linenos: :emphasize-lines: 1, 3 $ gcc -o server server.c $ sudo ./server RAW socket is listening Received: hello server! Received: hello server! Received: HELLO Received: HELLO Received: hello server! Received: hello server! Received: HELLO Received: HELLO Received: hello server! Received: hello server! Received: HELLO ^CCaught sigINT! .. _select_af_packet_raw_socket_client_sequence_diagram: .. tab-set:: .. tab-item:: Step 4: Sequence Diagram for CLIENT.c .. plantuml:: @startuml !theme spacelab start :socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL)); :bind(client_socket, (struct sockaddr*)&server_addr, sizeof(server_addr)); while (while(1)) is (yes) :send(client_socket, buffer, BUFFER_SIZE, 0); :FD_ZERO(&read_fds); :FD_SET(client_socket, &read_fds); :select(client_socket + 1, &read_fds, NULL, NULL, NULL); if (FD_ISSET(client_socket, &read_fds)) then (yes) :recv(client_socket, buffer, BUFFER_SIZE, 0); else (no) endif endwhile (CTRL+c) :(void)close(client_socket); stop @enduml .. _select_af_packet_raw_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 * Select * Send data_packet * Recv data_packet * Close socket * ``socket`` is used to create a new socket. For example, .. code-block:: c client_socket = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL)); * ``bind()`` is used to associate the socket with a specific address and port. For example, .. code-block:: c ret = bind(client_socket, (struct sockaddr*)&server_addr, sizeof(server_addr)); * ``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(client_socket + 1, &read_fds, NULL, NULL, NULL); * ``send`` is used in network programming to send data over a connected socket. For example, .. code-block:: c ret = send(client_socket, buffer, BUFFER_SIZE, 0); * ``recv`` is used in network programming to receive data from a connected socket. For example, .. code-block:: c len = 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:: raw_af_packet_raw_htons_ETH_P_ALL/client/client.c :language: c :emphasize-lines: 47, 48, 49, 64, 65, 66, 76, 77, 89, 90, 99, 100, 113 .. _select_af_packet_raw_socket_client_side_compile_and_execute: .. tab-set:: .. tab-item:: Step 6: Compile and Execute Client.c .. code-block:: c :linenos: :emphasize-lines: 1, 3 $ gcc -o client client.c $ sudo ./client Sentbuffer : hello server! Received : hello server! Sentbuffer : hello server! Received : HELLO Sentbuffer : hello server! Received : HELLO Sentbuffer : hello server! Received : HELLO Sentbuffer : hello server! Received : HELLO Sentbuffer : hello server! Received : HELLO Sentbuffer : hello server! Received : HELLO Sentbuffer : hello server! Received : HELLO Sentbuffer : hello server! Received : HELLO ^CCaught sigINT! .. tab-set:: .. tab-item:: Enhanced Socket Flexibility with ``AF_PACKET`` and ``PF_PACKET`` 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_PACKET`` domain, handling all types of network data. **Additional Domain Support:** We expand the socket's capabilities to also function in the ``PF_PACKET`` domain, allowing it to operate similarly to ``AF_PACKET``. **Socket Creation:** We set up a network connection point known as a socket using ``socket(PF_PACKET, SOCK_RAW, IPPROTO_UDP)``. **Working Scenario:** Despite the change in domain to ``PF_PACKET``, the socket continues to operate the same way, handling general network data. .. tab-set:: .. tab-item:: Enhanced Protocol Flexibility in Socket Configuration .. panels:: :container: container pb-4 :column: col-lg-12 p-2 :card: shadow **Default Protocol Support:** By default, the socket is configured to support the capture of all Ethernet frames ``(ETH_P_ALL protocol)``. **Additional Protocol:** The socket is designed to seamlessly support an additional protocol, namely ``ETH_P_PAE``. **Socket Creation:** A socket is created using the ``socket(AF_PACKET, SOCK_RAW, htons(ETH_P_PAE))`` call. **Working Scenario:** Despite the change in protocol to ``ETH_P_PAE``, the overall working scenario of the socket remains consistent. .. _select_af_packet_raw_Summary: .. tab-set:: .. tab-item:: Summary ============== ========================================================================================= Socket API Learning ============== ========================================================================================= socket Create a new socket bind Associate the socket with a specific address and port select Monitor multiple file descriptors (usually sockets) for read, write, or error conditions. recv Receive data from a connected socket. send Send data over a connected socket. ============== ========================================================================================= .. card:: See Also * Previous topic * :doc:`../../../sockets/raw_af_packet_raw_htons_ETH_P_ALL/Basic_example/Basic_example` * Current topic * :doc:`../../../sockets/raw_af_packet_raw_htons_ETH_P_ALL/select/select` * Next topic * :doc:`../../../sockets/raw_af_packet_raw_htons_ETH_P_ALL/poll/poll` * Other sockets * :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`