-
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.