[linux] unix domain socket 例子

服务器:

#include <stdlib.h>
#include <stdio.h>
#include <stddef.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <ctype.h> 

#define MAXLINE 80

char *socket_path = "server.socket";

int main(void)
{
    struct sockaddr_un serun, cliun;
    socklen_t cliun_len;
    int listenfd, connfd, size;
    char buf[MAXLINE];
    int i, n;

    if ((listenfd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) {
        perror("socket error");
        exit(1);
    }

    memset(&serun, 0, sizeof(serun));
    serun.sun_family = AF_UNIX;
    strcpy(serun.sun_path, socket_path);
    size = offsetof(struct sockaddr_un, sun_path) + strlen(serun.sun_path);
    unlink(socket_path);
    if (bind(listenfd, (struct sockaddr *)&serun, size) < 0) {
        perror("bind error");
        exit(1);
    }
    printf("UNIX domain socket bound\n");
    
    if (listen(listenfd, 20) < 0) {
        perror("listen error");
        exit(1);        
    }
    printf("Accepting connections ...\n");

    while(1) {
        cliun_len = sizeof(cliun);       
        if ((connfd = accept(listenfd, (struct sockaddr *)&cliun, &cliun_len)) < 0){
            perror("accept error");
            continue;
        }
        
        while(1) {
            n = read(connfd, buf, sizeof(buf));
            if (n < 0) {
                perror("read error");
                break;
            } else if(n == 0) {
                printf("EOF\n");
                break;
            }
            
            printf("received: %s\n", buf);

            for(i = 0; i < n; i++) {
                buf[i] = toupper(buf[i]);
            }
            write(connfd, buf, n);
        }
        close(connfd);
    }
    close(listenfd);
    return 0;
}


客户端:

#include <stdlib.h>
#include <stdio.h>
#include <stddef.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>

#define MAXLINE 80

char *client_path = "client.socket";
char *server_path = "server.socket";

int main() {
	struct  sockaddr_un cliun, serun;
	int len;
	char buf[100];
	int sockfd, n;

	if ((sockfd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0){
		perror("client socket error");
		exit(1);
	}
	
	// 一般显式调用bind函数,以便服务器区分不同客户端
	memset(&cliun, 0, sizeof(cliun));
    cliun.sun_family = AF_UNIX;
    strcpy(cliun.sun_path, client_path);
    len = offsetof(struct sockaddr_un, sun_path) + strlen(cliun.sun_path);
    unlink(cliun.sun_path);
    if (bind(sockfd, (struct sockaddr *)&cliun, len) < 0) {
        perror("bind error");
        exit(1);
    }

    memset(&serun, 0, sizeof(serun));
    serun.sun_family = AF_UNIX;
    strcpy(serun.sun_path, server_path);
    len = offsetof(struct sockaddr_un, sun_path) + strlen(serun.sun_path);
    if (connect(sockfd, (struct sockaddr *)&serun, len) < 0){
    	perror("connect error");
    	exit(1);
    }

    while(fgets(buf, MAXLINE, stdin) != NULL) {  
         write(sockfd, buf, strlen(buf));  
         n = read(sockfd, buf, MAXLINE);  
         if ( n < 0 ) {  
            printf("the other side has been closed.\n");  
         }else {  
            write(STDOUT_FILENO, buf, n);  
         }  
    } 
    close(sockfd);
    return 0;
}



  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
下面是一个使用 Unix Domain Socket 进行进程间通信的简单例子: 服务端代码: ```c #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/socket.h> #include <sys/un.h> #define SOCKET_PATH "/tmp/mysocket" int main(void) { int server_fd, client_fd; struct sockaddr_un server_addr, client_addr; socklen_t client_len; // 创建 socket server_fd = socket(AF_UNIX, SOCK_STREAM, 0); if (server_fd == -1) { perror("socket"); exit(EXIT_FAILURE); } // 绑定地址 memset(&server_addr, 0, sizeof(server_addr)); server_addr.sun_family = AF_UNIX; strncpy(server_addr.sun_path, SOCKET_PATH, sizeof(server_addr.sun_path) - 1); unlink(SOCKET_PATH); if (bind(server_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) { perror("bind"); exit(EXIT_FAILURE); } // 监听端口 if (listen(server_fd, 5) == -1) { perror("listen"); exit(EXIT_FAILURE); } printf("Listening on socket %s\n", SOCKET_PATH); while (1) { // 接受连接 client_len = sizeof(client_addr); client_fd = accept(server_fd, (struct sockaddr *)&client_addr, &client_len); if (client_fd == -1) { perror("accept"); continue; } printf("Accepted connection\n"); // 发送欢迎消息 if (write(client_fd, "Welcome to my server", 21) == -1) { perror("write"); close(client_fd); continue; } // 关闭连接 close(client_fd); } return 0; } ``` 客户端代码: ```c #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/socket.h> #include <sys/un.h> #define SOCKET_PATH "/tmp/mysocket" int main(void) { int server_fd; struct sockaddr_un server_addr; char buf[1024]; ssize_t n; // 创建 socket server_fd = socket(AF_UNIX, SOCK_STREAM, 0); if (server_fd == -1) { perror("socket"); exit(EXIT_FAILURE); } // 连接到服务端 memset(&server_addr, 0, sizeof(server_addr)); server_addr.sun_family = AF_UNIX; strncpy(server_addr.sun_path, SOCKET_PATH, sizeof(server_addr.sun_path) - 1); if (connect(server_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) { perror("connect"); exit(EXIT_FAILURE); } // 读取欢迎消息 n = read(server_fd, buf, sizeof(buf)); if (n == -1) { perror("read"); exit(EXIT_FAILURE); } printf("Received: %.*s\n", (int)n, buf); // 关闭连接 close(server_fd); return 0; } ``` 以上代码演示了一个简单的 Unix Domain Socket 客户端和服务端的通信过程。服务端创建了一个 Unix Domain Socket 并监听客户端的连接请求,客户端连接到服务端并发送一个请求,服务端收到请求后向客户端发送一个欢迎消息,然后关闭连接。通信过程中使用了 read 和 write 函数进行数据传输。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值