unix域套接口示例程序

本文提供了一个基于UNIX域套接字的通信示例,包括服务端与客户端的实现代码。服务端通过创建监听套接字、绑定地址、监听连接请求来接收客户端消息,并将消息记录到日志文件中;客户端则创建连接套接字并发送消息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

服务端示例:

#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <sys/un.h> #include <strings.h> #include <errno.h> #define UNIX_DOMAIN_PATH "/tmp/UNIX.domain" #define MAXBUFSIZE 1024 #define LISTENQ 10 #define LOG_FILE_PATH "/tmp/UNIX.log" int main() { int listenfd; int connfd; int len; int ret; pid_t childpid; struct sockaddr_un cliaddr; socklen_t cliaddr_len; struct sockaddr_un servaddr; listenfd = socket(AF_LOCAL, SOCK_STREAM, 0); if (listenfd < 0) { perror("cannot create listening socket"); return -1; } unlink(UNIX_DOMAIN_PATH); bzero(&servaddr, sizeof(servaddr)); servaddr.sun_family = AF_LOCAL; strncpy(servaddr.sun_path, UNIX_DOMAIN_PATH, sizeof(servaddr.sun_path)-1); ret = bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr)); if (ret == -1) { perror("cannot bind server socket"); close(listenfd); unlink(UNIX_DOMAIN_PATH); return -1; } ret = listen(listenfd, LISTENQ); if (ret == -1) { perror("cannot listen the client connect request"); close(listenfd); unlink(UNIX_DOMAIN_PATH); return 1; } while (1) { len = sizeof(cliaddr); connfd = accept(listenfd, (struct sockaddr*)&cliaddr, &len); if (connfd < 0) { if (errno == EINTR) { continue; } else { perror("cannot accept the client connect request"); close(listenfd); unlink(UNIX_DOMAIN_PATH); return -1; } } if ((childpid = fork()) < 0) { perror("cannot create child process"); close(listenfd); unlink(UNIX_DOMAIN_PATH); return -1; } else if (childpid == 0) { ret = server_accept(connfd); exit(ret); } else { close(connfd); } } close(listenfd); unlink(UNIX_DOMAIN_PATH); return 0; } int server_accept(int sockfd) { ssize_t n; char buf[MAXBUFSIZE]; time_t timestamp; FILE *fp; memset(buf, 0, sizeof(buf)); fp = fopen(LOG_FILE_PATH, "a"); if (fp == NULL) { perror("fopen log file"); return -1; } again: while ((n = recv(sockfd, buf, MAXBUFSIZE, 0)) > 0) { buf[n] = '/n'; buf[n+1] = '/0'; strcpy(buf+21, buf); timestamp = time(NULL); strftime(buf, 20, "%Y-%m-%d %H:%M:%S", localtime(&timestamp)); buf[19] = ':'; buf[20] = ' '; if (fputs(buf, fp)) { perror("fputs log file"); return -1; } } if (n<0 && errno==EINTR) { goto again; } else if (n < 0) { perror("recv connfd msg"); return -1; } close(sockfd); fclose(fp); return 0; }

客户端示例:

#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <sys/un.h> #include <strings.h> #include <errno.h> #define UNIX_DOMAIN_PATH "/tmp/UNIX.domain" #define MAXBUFSIZE 1024 int main() { int connfd; int ret; char buf[MAXBUFSIZE]; static struct sockaddr_un servaddr; connfd = socket(AF_LOCAL, SOCK_STREAM, 0); if (connfd < 0) { perror("cannot create connect socket"); return -1; } servaddr.sun_family = AF_LOCAL; strncpy(servaddr.sun_path, UNIX_DOMAIN_PATH, sizeof(servaddr.sun_path)-1); ret = connect(connfd, (struct sockaddr*)&servaddr, sizeof(servaddr)); if (ret == -1) { perror("cannot connect to the server"); return -1; } memset(buf, 0, MAXBUFSIZE); strcpy(buf, "client"); if (send(connfd, buf, strlen(buf), 0) == -1) { perror("cannot send msg to the server"); return -1; } close(connfd); return 0; }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值