diff --git a/socket_inet/Makefile b/socket_inet/Makefile new file mode 100644 index 0000000..cd2294a --- /dev/null +++ b/socket_inet/Makefile @@ -0,0 +1,19 @@ +CC ?= gcc +CFLAGS ?= -Wall -g + +all: server.elf client.elf + +server.elf: server.c +client.elf: client.c + +%.elf: %.c + @echo CC $@ + @$(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) + +test: all + bash test.sh + +clean: + rm -f *.elf *.o + +.PHONY: test clean diff --git a/socket_inet/client.c b/socket_inet/client.c new file mode 100644 index 0000000..287ab6f --- /dev/null +++ b/socket_inet/client.c @@ -0,0 +1,54 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#define MAX 80 +#define PORT 8080 + +void func(int sockfd) { + char buff[MAX]; + + for (;;) { + char *msg = "Ping\n"; + write(sockfd, msg, sizeof(buff)); + + bzero(buff, sizeof(buff)); + read(sockfd, buff, sizeof(buff)); + + printf("From Server : %s", buff); + if ((strncmp(buff, "exit", 4)) == 0) { + printf("Client Exit...\n"); + break; + } + + exit(0); + } +} + +int main() { + int sockfd = socket(AF_INET, SOCK_STREAM, 0); + if (sockfd == -1) { + printf("socket creation failed...\n"); + exit(0); + } + printf("Socket successfully created..\n"); + + struct sockaddr_in servaddr; + bzero(&servaddr, sizeof(servaddr)); + servaddr.sin_family = AF_INET; + servaddr.sin_addr.s_addr = inet_addr("127.0.0.1"); + servaddr.sin_port = htons(PORT); + + if (connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) != 0) { + printf("connection with the server failed...\n"); + exit(0); + } + + func(sockfd); + close(sockfd); +} diff --git a/socket_inet/server.c b/socket_inet/server.c new file mode 100644 index 0000000..7bfb2fe --- /dev/null +++ b/socket_inet/server.c @@ -0,0 +1,73 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#define MAX 80 +#define PORT 8080 + +void func(int connfd) { + char buff[MAX]; + + for (;;) { + bzero(buff, MAX); + + ssize_t recv_n = recv(connfd, buff, sizeof(buff), 0); + if (recv_n >= MAX) { + /* Likely more data, realloc */ + } + + buff[recv_n - 1] = '\0'; + printf("From client: %s\n", buff); + bzero(buff, MAX); + + char *msg = "Hello!\n"; + send(connfd, msg, strlen(msg), 0); + + if (strncmp("exit", buff, 4) == 0) { + printf("Server Exit...\n"); + break; + } + } +} + +int main() { + int sockfd = socket(AF_INET, SOCK_STREAM, 0); + if (sockfd == -1) { + printf("socket creation failed...\n"); + exit(0); + } + + struct sockaddr_in servaddr; + bzero(&servaddr, sizeof(servaddr)); + + servaddr.sin_family = AF_INET; + servaddr.sin_addr.s_addr = htonl(INADDR_ANY); + servaddr.sin_port = htons(PORT); + + if ((bind(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr))) != 0) { + printf("socket bind failed...\n"); + exit(0); + } + + if ((listen(sockfd, 5)) != 0) { + printf("Listen failed...\n"); + exit(0); + } + + struct sockaddr_in cli; + socklen_t len = sizeof(cli); + + int connfd = accept(sockfd, (struct sockaddr *)&cli, &len); + if (connfd < 0) { + printf("server accept failed...\n"); + exit(0); + } + + func(connfd); + close(sockfd); +} diff --git a/socket_inet/socket.c b/socket_inet/socket.c new file mode 100644 index 0000000..9115379 --- /dev/null +++ b/socket_inet/socket.c @@ -0,0 +1,73 @@ +#include +#include +#include +#include +#include +#include + +#define SOCKET_PATH "/tmp/demosocket" +#define BUF_SIZE 128 + +int main(void) { + int server_fd, client_fd; + struct sockaddr_un addr; + char buf[BUF_SIZE]; + + // Clean up any leftover socket file + unlink(SOCKET_PATH); + + // Create socket + server_fd = socket(AF_UNIX, SOCK_STREAM, 0); + if (server_fd == -1) { + perror("socket"); + exit(EXIT_FAILURE); + } + + // Zero out and set up the address structure + memset(&addr, 0, sizeof(addr)); + addr.sun_family = AF_UNIX; + strncpy(addr.sun_path, SOCKET_PATH, sizeof(addr.sun_path) - 1); + + // Bind the socket to the path + if (bind(server_fd, (struct sockaddr *)&addr, sizeof(addr)) == -1) { + perror("bind"); + close(server_fd); + exit(EXIT_FAILURE); + } + + // Listen for a connection + if (listen(server_fd, 1) == -1) { + perror("listen"); + close(server_fd); + exit(EXIT_FAILURE); + } + + printf("Server listening on %s...\n", SOCKET_PATH); + + // Accept a connection + client_fd = accept(server_fd, NULL, NULL); + if (client_fd == -1) { + perror("accept"); + close(server_fd); + exit(EXIT_FAILURE); + } + + // Receive a message + ssize_t received = recv(client_fd, buf, BUF_SIZE - 1, 0); + if (received > 0) { + buf[received] = '\0'; + printf("Received: %s", buf); + + // Send a reply + const char *reply = "Got your message!\n"; + send(client_fd, reply, strlen(reply), 0); + } else { + perror("recv"); + } + + // Clean up + close(client_fd); + close(server_fd); + unlink(SOCKET_PATH); + return 0; +} diff --git a/socket_inet/test.sh b/socket_inet/test.sh new file mode 100644 index 0000000..acb788e --- /dev/null +++ b/socket_inet/test.sh @@ -0,0 +1,26 @@ +#!/bin/bash + +SOCKET_PATH="/tmp/demosocket" + +# Cleanup function to be run on exit +cleanup() { + echo "Cleaning up..." + if [[ -n "$SERVER_PID" ]]; then + kill "$SERVER_PID" 2>/dev/null || true + wait "$SERVER_PID" 2>/dev/null || true + fi + rm -f "$SOCKET_PATH" +} + +# Trap EXIT to ensure cleanup runs +trap cleanup EXIT + +echo "Starting server..." +./server.elf & +SERVER_PID=$! + +# Wait briefly for the server to start +sleep 0.2 + +echo "Running client..." +./client.elf