• chevron_right

      Hello World - Unix Socket - SOCK_DGRAM

      pubsub.movim.eu / devlug • 29 November 2025 edit • 2 minutes

    Kleines Hello World Programm für die IPC via Unix Socket. Das Beispiel werde ich nach und nach ausbauen und mal sehen, ob ich dies im Kontext eines #XMPP Dienst mit UI irgendwie nutzen kann.

    Als erstes definieren wir eine Header-Datei config.h um Informationen für Server und Client zu teilen.

    #ifndef _SANDBOX_SOCKET_H__
    #define _SANDBOX_SOCKET_H__
    
    #define SOCKET_NAME "/tmp/devlug-sandbox-1234.socket"
    #define BUFFER_SIZE 50
    
    #endif // _SANDBOX_SOCKET_H__
    

    Dann ein kleines Server Programm.

    #include <err.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/socket.h>
    #include <sys/un.h>
    #include <unistd.h>
    
    #include "config.h"
    
    int main(int argc, char *argv[]) {
      int serverfd = socket(AF_UNIX, SOCK_DGRAM, 0);
      if (serverfd == -1) {
        err(EXIT_FAILURE, "Socket fehler");
      }
      struct sockaddr_un name;
      memset(&name, 0, sizeof(name));
      name.sun_family = AF_UNIX;
      strncpy(name.sun_path, SOCKET_NAME, sizeof(name.sun_path) - 1);
      int ret = bind(serverfd, (const struct sockaddr *)&name, sizeof(name));
      if (ret == -1) {
        err(EXIT_FAILURE, "Bind %s failed", SOCKET_NAME);
      }
    
      for (;;) {
        char data_msg[BUFFER_SIZE];
        ssize_t size = recv(serverfd, data_msg, sizeof(data_msg) - 1, 0);
        if (size == -1) {
          close(serverfd);
          unlink(SOCKET_NAME);
        }
        data_msg[size] = 0;
        printf("Msg: %s\n", data_msg);
      }
    
      close(serverfd);
      unlink(SOCKET_NAME);
      return EXIT_SUCCESS;
    }
    

    Analog ein kleiner Client.

    #include <err.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/socket.h>
    #include <sys/un.h>
    #include <unistd.h>
    
    #include "config.h"
    
    int main(int argc, char *argv[]) {
      int socketfd = socket(AF_UNIX, SOCK_DGRAM, 0);
      if (socketfd == -1) {
        err(EXIT_FAILURE, "Socket fehler");
      }
      struct sockaddr_un name;
      memset(&name, 0, sizeof(name));
      name.sun_family = AF_UNIX;
      strncpy(name.sun_path, SOCKET_NAME, sizeof(name.sun_path) - 1);
      int ret = connect(socketfd, (const struct sockaddr *)&name, sizeof(name));
      if (ret == -1) {
        err(EXIT_FAILURE, "Connect of %s failed", SOCKET_NAME);
      }
    
      char data_msg[BUFFER_SIZE];
      for (;;) {
        size_t size = read(0, data_msg, sizeof(data_msg) - 1);
        data_msg[size] = 0;
        printf("Daten: %s\n", data_msg);
        size = send(socketfd, data_msg, size+1, 0);
        if (size == -1) {
          close(socketfd);
          unlink(SOCKET_NAME);
        }
      }
    
      close(socketfd);
      unlink(SOCKET_NAME);
      return EXIT_SUCCESS;
    }
    

    Mal sehen was man damit alles so anfangen kann :) Wer Lust auf mehr hat, kann auch gerne im Raum xmpp:gnu-linux-devel@rooms.devlug.de?join vorbei gucken.

    Ich habe dann ein Makefile erstellt.

    OPT=-Wall -Werror -Wextra -Wpedantic
    
    build: server client
    
    server: server.c config.h
            gcc ${OPT} -o $@ $<
    
    client: client.c config.h
            gcc ${OPT} -o $@ $<
    
    clean:
            -rm -rf client
            -rm -rf server
    

    Beim bauen ist dann folgendes aufgefallen.

    comparison of integer expressions of different signedness: ‘size_t’ {aka ‘long unsigned int’} and ‘int’
    

    Es ist immer gut, wenn man einige Compiler Optionen setzt.

    • chevron_right

      Hello World - Unix Socket - SOCK_DGRAM

      pubsub.movim.eu / devlug • 29 November 2025 edit • 2 minutes

    Kleines Hello World Programm für die IPC via Unix Socket. Das Beispiel werde ich nach und nach ausbauen und mal sehen, ob ich dies im Kontext eines #XMPP Dienst mit UI irgendwie nutzen kann.

    Als erstes definieren wir eine Header-Datei config.h um Informationen für Server und Client zu teilen.

    #ifndef _SANDBOX_SOCKET_H__
    #define _SANDBOX_SOCKET_H__
    
    #define SOCKET_NAME "/tmp/devlug-sandbox-1234.socket"
    #define BUFFER_SIZE 50
    
    #endif // _SANDBOX_SOCKET_H__
    

    Dann ein kleines Server Programm.

    #include <err.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/socket.h>
    #include <sys/un.h>
    #include <unistd.h>
    
    #include "config.h"
    
    int main(int argc, char *argv[]) {
      int serverfd = socket(AF_UNIX, SOCK_DGRAM, 0);
      if (serverfd == -1) {
        err(EXIT_FAILURE, "Socket fehler");
      }
      struct sockaddr_un name;
      memset(&name, 0, sizeof(name));
      name.sun_family = AF_UNIX;
      strncpy(name.sun_path, SOCKET_NAME, sizeof(name.sun_path) - 1);
      int ret = bind(serverfd, (const struct sockaddr *)&name, sizeof(name));
      if (ret == -1) {
        err(EXIT_FAILURE, "Bind %s failed", SOCKET_NAME);
      }
    
      for (;;) {
        char data_msg[BUFFER_SIZE];
        ssize_t size = recv(serverfd, data_msg, sizeof(data_msg) - 1, 0);
        if (size == -1) {
          close(serverfd);
          unlink(SOCKET_NAME);
        }
        data_msg[size] = 0;
        printf("Msg: %s\n", data_msg);
      }
    
      close(serverfd);
      unlink(SOCKET_NAME);
      return EXIT_SUCCESS;
    }
    

    Analog ein kleiner Client.

    #include <err.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/socket.h>
    #include <sys/un.h>
    #include <unistd.h>
    
    #include "config.h"
    
    int main(int argc, char *argv[]) {
      int socketfd = socket(AF_UNIX, SOCK_DGRAM, 0);
      if (socketfd == -1) {
        err(EXIT_FAILURE, "Socket fehler");
      }
      struct sockaddr_un name;
      memset(&name, 0, sizeof(name));
      name.sun_family = AF_UNIX;
      strncpy(name.sun_path, SOCKET_NAME, sizeof(name.sun_path) - 1);
      int ret = connect(socketfd, (const struct sockaddr *)&name, sizeof(name));
      if (ret == -1) {
        err(EXIT_FAILURE, "Connect of %s failed", SOCKET_NAME);
      }
    
      char data_msg[BUFFER_SIZE];
      for (;;) {
        size_t size = read(0, data_msg, sizeof(data_msg) - 1);
        data_msg[size] = 0;
        printf("Daten: %s\n", data_msg);
        size = send(socketfd, data_msg, size+1, 0);
        if (size == -1) {
          close(socketfd);
          unlink(SOCKET_NAME);
        }
      }
    
      close(socketfd);
      unlink(SOCKET_NAME);
      return EXIT_SUCCESS;
    }
    

    Mal sehen was man damit alles so anfangen kann :) Wer Lust auf mehr hat, kann auch gerne im Raum xmpp:gnu-linux-devel@rooms.devlug.de?join vorbei gucken.

    Ich habe dann ein Makefile erstellt.

    OPT=-Wall -Werror -Wextra -Wpedantic
    
    build: server client
    
    server: server.c config.h
            gcc ${OPT} -o $@ $<
    
    client: client.c config.h
            gcc ${OPT} -o $@ $<
    
    clean:
            -rm -rf client
            -rm -rf server
    

    Beim bauen ist dann folgendes aufgefallen.

    comparison of integer expressions of different signedness: ‘size_t’ {aka ‘long unsigned int’} and ‘int’
    

    Es ist immer gut, wenn man einige Compiler Optionen setzt.

    • chevron_right

      Hello World - Unix Socket - SOCK_DGRAM

      pubsub.movim.eu / devlug • 29 November 2025 edit • 2 minutes

    Kleines Hello World Programm für die IPC via Unix Socket. Das Beispiel werde ich nach und nach ausbauen und mal sehen, ob ich dies im Kontext eines #XMPP Dienst mit UI irgendwie nutzen kann.

    Als erstes definieren wir eine Header-Datei config.h um Informationen für Server und Client zu teilen.

    #ifndef _SANDBOX_SOCKET_H__
    #define _SANDBOX_SOCKET_H__
    
    #define SOCKET_NAME "/tmp/devlug-sandbox-1234.socket"
    #define BUFFER_SIZE 50
    
    #endif // _SANDBOX_SOCKET_H__
    

    Dann ein kleines Server Programm.

    #include <err.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/socket.h>
    #include <sys/un.h>
    #include <unistd.h>
    
    #include "config.h"
    
    int main(int argc, char *argv[]) {
      int serverfd = socket(AF_UNIX, SOCK_DGRAM, 0);
      if (serverfd == -1) {
        err(EXIT_FAILURE, "Socket fehler");
      }
      struct sockaddr_un name;
      memset(&name, 0, sizeof(name));
      name.sun_family = AF_UNIX;
      strncpy(name.sun_path, SOCKET_NAME, sizeof(name.sun_path) - 1);
      int ret = bind(serverfd, (const struct sockaddr *)&name, sizeof(name));
      if (ret == -1) {
        err(EXIT_FAILURE, "Bind %s failed", SOCKET_NAME);
      }
    
      for (;;) {
        char data_msg[BUFFER_SIZE];
        ssize_t size = recv(serverfd, data_msg, sizeof(data_msg) - 1, 0);
        if (size == -1) {
          close(serverfd);
          unlink(SOCKET_NAME);
        }
        data_msg[size] = 0;
        printf("Msg: %s\n", data_msg);
      }
    
      close(serverfd);
      unlink(SOCKET_NAME);
      return EXIT_SUCCESS;
    }
    

    Analog ein kleiner Client.

    #include <err.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/socket.h>
    #include <sys/un.h>
    #include <unistd.h>
    
    #include "config.h"
    
    int main(int argc, char *argv[]) {
      int socketfd = socket(AF_UNIX, SOCK_DGRAM, 0);
      if (socketfd == -1) {
        err(EXIT_FAILURE, "Socket fehler");
      }
      struct sockaddr_un name;
      memset(&name, 0, sizeof(name));
      name.sun_family = AF_UNIX;
      strncpy(name.sun_path, SOCKET_NAME, sizeof(name.sun_path) - 1);
      int ret = connect(socketfd, (const struct sockaddr *)&name, sizeof(name));
      if (ret == -1) {
        err(EXIT_FAILURE, "Connect of %s failed", SOCKET_NAME);
      }
    
      char data_msg[BUFFER_SIZE];
      for (;;) {
        size_t size = read(0, data_msg, sizeof(data_msg) - 1);
        data_msg[size] = 0;
        printf("Daten: %s\n", data_msg);
        size = send(socketfd, data_msg, size+1, 0);
        if (size == -1) {
          close(socketfd);
          unlink(SOCKET_NAME);
        }
      }
    
      close(socketfd);
      unlink(SOCKET_NAME);
      return EXIT_SUCCESS;
    }
    

    Mal sehen was man damit alles so anfangen kann :) Wer Lust auf mehr hat, kann auch gerne im Raum xmpp:gnu-linux-devel@rooms.devlug.de?join vorbei gucken.

    Ich habe dann ein Makefile erstellt.

    OPT=-Wall -Werror -Wextra -Wpedantic
    
    build: server client
    
    server: server.c config.h
            gcc ${OPT} -o $@ $<
    
    client: client.c config.h
            gcc ${OPT} -o $@ $<
    
    clean:
            -rm -rf client
            -rm -rf server
    

    Beim bauen ist dann folgendes aufgefallen.

    comparison of integer expressions of different signedness: ‘size_t’ {aka ‘long unsigned int’} and ‘int’
    

    Es ist immer gut, wenn man einige Compiler Optionen setzt.