unix domain socket的用法

服务器程序

复制代码
#include <stdio.h>
#include <sys/un.h>
#include <sys/socket.h>
#include <errno.h>
#include <unistd.h>

#define SV_SOCK_PATH "/tmp/us_xfr"
#define BUF_SIZE 100
#define BACKLOG 5

int main() {
    struct sockaddr_un addr;
    int sfd, cfd;
    ssize_t numRead;
    char buf[BUF_SIZE];

    sfd = socket(AF_UNIX, SOCK_STREAM, 0);
    if(sfd == -1) {
        fprintf(stderr, "socket error");
        return -1;
    }
    if(remove(SV_SOCK_PATH) == -1 && errno != ENOENT) {
        fprintf(stderr, "remove /tmp/us_xfr");
        return -1;
    }
    memset(&addr, 0, sizeof(struct sockaddr_un));
    addr.sun_family = AF_UNIX;
    strncpy(addr.sun_path, SV_SOCK_PATH, sizeof(addr.sun_path)-1);
    if(bind(sfd, (struct sockaddr*)&addr, sizeof(struct sockaddr_un)) == -1) {
        fprintf(stderr, "bind error.");
        return -1;
    }

    if(listen(sfd, BACKLOG) == -1) {
        fprintf(stderr, "listen error");
        return -1;
    }

    for(;;) {
        cfd = accept(sfd, NULL, NULL);
        if(cfd == -1) {
            fprintf(stderr, "accept error.");
            return -1;
        }

        while((numRead = read(cfd, buf, BUF_SIZE)) > 0) {
            if(write(STDOUT_FILENO, buf, numRead) != numRead) {
                fprintf(stderr, "write error.");
                return -1;
            }
        }
        if(numRead == -1) {
            fprintf(stderr, "read error.");
            return -1;
        }
        if(close(cfd) == -1) {
            fprintf(stderr, "close error.");
            return -1;
        }
    }

    return 0;
}
复制代码

客户端代码

复制代码
#include <stdio.h>
#include <unistd.h>
#include <sys/un.h>
#include <sys/socket.h>

#define SV_SOCK_PATH "/tmp/us_xfr"
#define BUF_SIZE 100

int main() {
    struct sockaddr_un addr;
    int sfd;
    ssize_t numRead;
    char buf[BUF_SIZE];

    sfd = socket(AF_UNIX, SOCK_STREAM, 0);
    if(sfd == -1) {
        fprintf(stderr, "socket error");
        return -1;
    }

    memset(&addr, 0, sizeof(struct sockaddr_un));
    addr.sun_family = AF_UNIX;
    strncpy(addr.sun_path, SV_SOCK_PATH, sizeof(addr.sun_path)-1);

    if(connect(sfd, (struct sockaddr *)&addr, sizeof(struct sockaddr_un)) == -1) {
        fprintf(stderr, "connect error.");
        return -1;
    }

    while((numRead=read(STDIN_FILENO, buf, BUF_SIZE)) > 0) {
        if(write(sfd, buf, numRead) != numRead) {
            fprintf(stderr, "partial/failed write");
            return -1;
        }
    }

    if(numRead == -1) {
        fprintf(stderr, "read error");
        return -1;
    }
    return 0;
}
复制代码

 

posted @   东宫得臣  阅读(239)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示