[PYTHON] Erstellen Sie einen Unix Domain Socket-Server

Ich habe in meiner Studie einen Unix Domain Socket geschrieben, daher hinterlasse ich eine Notiz.

Python

Der Unterschied zu TCP besteht darin, dass "socket.AF_UNIX" zum Zeitpunkt der "Socket" -Initialisierung angegeben wird und das Argument ".bind ()" der Pfad ist. Wenn die angegebene Datei jedoch bereits vorhanden ist, tritt ein Fehler auf, sodass "unlink ()" unmittelbar vor ".bind ()" ausgeführt werden sollte.

uds_server.py


#!/usr/bin/env python
import os
import signal
import socket

signal.signal(signal.SIGPIPE, signal.SIG_IGN)

sock = socket.socket(socket.AF_UNIX)
os.unlink('test.uds')
sock.bind('test.uds')
sock.listen(10)

while True:
    s, addr = sock.accept()
    print "connected from:", addr
    while True:
        s.sendall("a"*60 + '\n')

C

Der Umgang mit sockaddr_un ist im Vergleich zu Python etwas umständlich. Beachten Sie, dass sockaddr_un.sun_path kurz ist. Es scheint, dass Sie in einer tiefen Verzeichnisstruktur keinen Socket erstellen können. Python verwendet es schließlich auch intern, sodass Sie sich der Pfadlängenbeschränkung nicht entziehen sollten.

uds_server.c


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <errno.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <sys/un.h>
#include <netinet/in.h>
#include <signal.h>

static char buf[] = "aaaaaaaaaaaaaaaaaa\n";

int main()
{
    int r;
    int listen_fd = 0;
    struct sockaddr_un local, remote;

    signal(SIGPIPE, SIG_IGN);
    listen_fd = socket(PF_UNIX, SOCK_STREAM, 0);
    local.sun_family = AF_UNIX;
    strcpy(local.sun_path, "test.uds");
    unlink(local.sun_path);
    r = bind(listen_fd, (struct sockaddr *)&local, sizeof(local));
    if (r)
        perror("failed to bind");

    listen(listen_fd, 100);
    for (;;) {
        socklen_t len = sizeof(remote);
        int remote_fd = accept(listen_fd, (struct sockaddr *)&remote, &len);
        if (remote_fd < 0) {
            perror("failed to accept");
            return 0;
        }
        for (;;) {
            int sent = write(remote_fd, buf, 20);
            printf("sent %d bytes\n", sent);
            if (sent < 0) {
                printf("%d %s\n", errno, strerror(errno));
                perror("fail to send");
                close(remote_fd);
                break;
            }
        }
    }
}

Recommended Posts

Erstellen Sie einen Unix Domain Socket-Server
Erstellen Sie einen (einfachen) REST-Server
Erstellen Sie einen einfachen Textlint-Server
Die Weiterleitung des Bindungsports an den Unix-Domain-Socket funktioniert besser
Erstellen Sie in Tornado einen HTTP-Server (Hello World)
Erstellen Sie einen Django-Zeitplan
Erstellen Sie mit GitHub Pages einen Pseudo-REST-API-Server
Erstellen Sie eine bootfähige LV
Erstellen Sie einen Home Music Server mit Centos8 + Universal Media Server
Erstellen Sie einen Webserver in der Sprache Go (net / http) (1)
So erstellen Sie ein einfaches TCP-Server / Client-Skript
Erstellen Sie eine Python-Umgebung
Erstellen Sie mit Quarry einen gefälschten Minecraft-Server in Python
Erstellen Sie einen Slack Bot
Erstellen Sie ein Wox-Plugin (Python)
Erstellen Sie eine Funktion in Python
Erstellen Sie ein Wörterbuch in Python
Erstellen Sie eine Homepage mit Django
Erstellen Sie eine Dummy-Datendatei
Erstellen Sie einen Django-Anmeldebildschirm
Erstellen Sie ein Klassenzimmer auf Jupyterhub
Erstellen Sie ein Verzeichnis mit Python
Erstellen Sie einen rudimentären ELF-Packer
Ich habe versucht, eine Serverumgebung zu erstellen, die unter Windows 10 ausgeführt wird