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; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现