Skip to content

A comprehensive client-server application written in C that demonstrates secure, encrypted communication over both TCP (using TLS) and UDP (using DTLS) with the OpenSSL library.

License

Notifications You must be signed in to change notification settings

awmiriiw/c-socket

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

3 Commits
 
 
 
 
 
 

Repository files navigation

c-socket

A comprehensive client-server application written in C that demonstrates secure, encrypted communication over both TCP (using TLS) and UDP (using DTLS) with the OpenSSL library.

🔎 About

This project was created to provide a clear and practical example of secure socket programming. Implementing TLS and DTLS from scratch can be a complex task, especially when handling different protocols and managing multiple clients. This repository breaks down the process into a well-structured, multi-threaded server that can handle both TCP and UDP connections simultaneously, along with corresponding clients to test the functionality.

The server uses pthreads to manage concurrent TCP clients and implements a custom session management system to handle connectionless DTLS clients. The codebase is organized modularly with a clean Makefile build system, making it an excellent learning resource for students, developers, or anyone interested in network security and C programming.

🛠️ Features

  • Hybrid Server: A single server application listens for and handles both TCP and UDP connections on different ports.
  • Secure Communication: Implements TLS v1.2+ for TCP and DTLS v1.2 for UDP to encrypt all data exchanged between the server and clients.
  • Multi-Client Handling: Uses POSIX threads (pthreads) to handle multiple TCP clients concurrently without blocking.
  • DTLS Session Management: Includes a robust mechanism to find or create sessions for new DTLS clients, with automatic cleanup for timed-out sessions.
  • Functional & Clean Code: The project is organized into client, server, and common modules with separate header files and a functional programming style for better readability and maintenance.
  • Robust Logging: Features a custom logging utility that writes timestamped events, errors, and debug messages to both the console and log files.
  • Makefile Build System: A clean and efficient Makefile automates the entire compilation process.
  • Example Clients: Comes with three separate clients to demonstrate:
    • Secure TCP (TLS) communication.
    • Secure UDP (DTLS) communication.
    • A basic (unencrypted) UDP broadcast.

📂 Project Structure

The source code is organized into a clean and logical directory structure.

.
├── README.md
└── src
    ├── certs/
    │   ├── cert.pem
    │   └── key.pem
    ├── client/
    │   ├── broadcast-client.c
    │   ├── tcp-client.c
    │   └── udp-client.c
    ├── common/
    │   ├── logger.c
    │   └── utils.c
    ├── include/
    │   ├── broadcast-client.h
    │   ├── logger.h
    │   ├── protocol.h
    │   ├── server.h
    │   ├── tcp-client.h
    │   └── udp-client.h
    │   └── utils.h
    ├── Makefile
    └── server/
        └── server.c

🚀 Getting Started

Follow these instructions to get the project compiled and running on your system.

Prerequisites

Before you begin, ensure you have the following installed on your Linux system:

  • GCC Compiler: Or any standard C compiler.

  • Make: To build the project using the Makefile.

  • OpenSSL Libraries: The development package is required.

    # For Debian / Ubuntu
    sudo apt update 
    sudo apt install build-essential libssl-dev
    # For Arch Linux
    sudo pacman -Syu
    sudo pacman -S base-devel openssl

Installation & Usage

  1. Clone the repository:

    git clone "https://github.com/awmiriiw/c-socket.git"
    cd c-socket/src
  2. Generate Self-Signed Certificates: The project requires SSL certificates to run. You can generate a self-signed pair for testing.

    # Run this command from the src/ directory
    mkdir -p certs && openssl req -x509 -newkey rsa:4096 -nodes -keyout certs/key.pem -out certs/cert.pem -days 365

    (You can skip the informational prompts by pressing Enter.)

  3. Compile the Project: Run make to compile the server and all clients. The executables will be placed in the src/bin/ directory.

    make
  4. Run the Server: Open a terminal and start the server. It will listen for connections on ports 8080 (TCP) and 8081 (UDP).

    ./bin/server
  5. Run the Clients: Open new terminal windows for each client.

    • Secure TCP Client:

      ./bin/tcp-client

      You can now type messages, and the server will echo them back.

    • Secure UDP Client:

      ./bin/udp-client

      This client also functions as an echo client but over DTLS.

    • UDP Broadcast Client:

      ./bin/broadcast-client

      (Note: The server does not handle this broadcast; it's a client-to-client example.)

  6. Clean Up: To remove all compiled binaries, object files, and logs, run:

    make clean

📝 License

This project is open-source and available under the GNU AGPLv3 License.

Thanks for visiting! ☕

About

A comprehensive client-server application written in C that demonstrates secure, encrypted communication over both TCP (using TLS) and UDP (using DTLS) with the OpenSSL library.

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published