I am playing with simple examples of UDP sockets server and client code.
Sharing my code as below :
//server.c#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <sys/socket.h>#include <sys/un.h>#include <errno.h>#define SOCKET_PATH "/tmp/my_socket"int main() { int server_fd; struct sockaddr_un server_addr; int value = 0; // Initial integer value to send // Remove existing socket file if present unlink(SOCKET_PATH); // Create socket if ((server_fd = socket(AF_LOCAL, SOCK_DGRAM, 0)) == -1) { perror("socket"); exit(EXIT_FAILURE); } // Set up server address memset(&server_addr, 0, sizeof(struct sockaddr_un)); server_addr.sun_family = AF_LOCAL; strncpy(server_addr.sun_path, SOCKET_PATH, sizeof(server_addr.sun_path) - 1); // Bind socket if (bind(server_fd, (struct sockaddr*)&server_addr, sizeof(struct sockaddr_un)) == -1) { perror("bind"); exit(EXIT_FAILURE); } printf("Server started. Writing integer values to socket continuously...\n"); // Continuously write integer values to socket while (1) { // Print the integer value printf("Sending value to client: %d\n", value); // Convert integer value to string char buffer[32]; snprintf(buffer, sizeof(buffer), "%d", value); // Send integer value to client if (sendto(server_fd, buffer, strlen(buffer), 0, (struct sockaddr*)&server_addr, sizeof(struct sockaddr_un)) == -1) { perror("sendto"); } // Increment value for the next iteration value++; // Sleep for a short duration (e.g., 1 second) sleep(1); } // Close server socket (not reachable in this example) close(server_fd); return 0;}
Which will send data continuously to a socket.
I think it works as expected, I am getting following output :
Server started. Writing integer values to socket continuously...Sending value to client: 0Sending value to client: 1Sending value to client: 2...
Now I tried to make a client code which should be able to receive data from server, as below :
//client.c#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <sys/socket.h>#include <sys/un.h>#include <errno.h>#include <fcntl.h>#define SOCKET_PATH "/tmp/my_socket"int main() { int client_fd; struct sockaddr_un server_addr; char buffer[1024]; // Create socket if ((client_fd = socket(AF_LOCAL, SOCK_DGRAM, 0)) == -1) { perror("socket"); exit(EXIT_FAILURE); } // Set socket to non-blocking mode if (fcntl(client_fd, F_SETFL, O_NONBLOCK) == -1) { perror("fcntl"); exit(EXIT_FAILURE); } // Set up server address memset(&server_addr, 0, sizeof(struct sockaddr_un)); server_addr.sun_family = AF_LOCAL; strncpy(server_addr.sun_path, SOCKET_PATH, sizeof(server_addr.sun_path) - 1); printf("Client connected to server. Reading integer values...\n"); // Continuously read integer values from server while (1) { // Receive integer value from server ssize_t bytes_received = recv(client_fd, buffer, sizeof(buffer), 0); if (bytes_received == -1) { if (errno == EAGAIN || errno == EWOULDBLOCK) { // No data available, continue loop printf("No data available\n"); continue; } else { perror("recv"); exit(EXIT_FAILURE); } } else if (bytes_received == 0) { printf("Server closed the connection\n"); break; } // Null-terminate the received data buffer[bytes_received] = '\0'; // Print received data printf("Received data from server: %s\n", buffer); } // Close client socket close(client_fd); return 0;}
But I am getting continuously, the following output :
Client connected to server. Reading integer values...No data availableNo data availableNo data available...
It seems client is not able to get data written by server.
I am running these programs in Ubuntu from two different terminals.
Could anyone please tell how to debug/solution?