Créer un serveur de socket de domaine Unix

J'ai écrit un socket de domaine Unix dans mon étude, je vais donc laisser une note.

Python

La différence avec TCP est que socket.AF_UNIX est spécifié au moment de l'initialisation de socket, et l'argument de.bind ()est le chemin. Cependant, si le fichier spécifié existe déjà, une erreur se produira, donc ʻunlink () doit être fait juste avant .bind () `.

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

Gérer sockaddr_un est un peu compliqué par rapport à Python. Notez que sockaddr_un.sun_path est court. Il semble que vous ne pouvez pas créer de socket dans une structure de répertoires profonde. Python l'utilise également en interne après tout, vous ne devriez donc pas pouvoir échapper à la limite de longueur de chemin.

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

Créer un serveur de socket de domaine Unix
Créer un serveur REST (simple)
Créer un serveur textlint simple
La liaison du transfert de port au socket de domaine Unix fonctionne mieux
Créer un serveur "Hello World" (HTTP) dans Tornado
Créer un planning Django
Créer un pseudo serveur d'API REST à l'aide de pages GitHub
Créer un LV amorçable
Créez un serveur de musique domestique avec Centos8 + Universal Media Server
Créer un serveur Web en langage Go (net / http) (1)
Comment créer un simple script serveur / client TCP
Créer un environnement Python
Créez un faux serveur Minecraft en Python avec Quarry
Créer un bot slack
Créer un plugin Wox (Python)
Créer un référentiel pypi local
Créer une fonction en Python
Créer un dictionnaire en Python
Créer une page d'accueil avec django
Créer un fichier de données factice
Créer un écran de connexion Django
Créer une salle de classe sur Jupyterhub
Créer un répertoire avec python
Créer un packer ELF rudimentaire
J'ai essayé de créer un environnement serveur qui fonctionne sous Windows 10