• unix socket share different docker


    unix server 

    root@ubuntu:~/docker# docker run -it --name debian  -v /data1/unix_domain:/data1/unix_domain debian
    root@b1a3bef38722:/# ls
    bin  boot  data1  dev  etc  home  lib  media  mnt  opt  proc  root  run  sbin  server  srv  sys  tmp  usr  var

    unix client 

    root@ubuntu:~/docker# docker run -it --name debian2  -v /data1/unix_domain:/data1/unix_domain debian
    root@d92cea9a459c:/# ls
    bin  boot  client  data1  dev  etc  home  lib  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

    docker cp server 和client

    root@ubuntu:~/docker/unix-domain-socket-example# docker ps
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
    b1a3bef38722        debian              "bash"                   23 seconds ago      Up 22 seconds                           debian
    176fb79cdcef        nginx:1.17.4        "nginx -g 'daemon of…"   3 weeks ago         Up 3 weeks          80/tcp              test-vm
    root@ubuntu:~/docker/unix-domain-socket-example# docker cp bin/server debian:/
    root@ubuntu:~/docker/unix-domain-socket-example# docker cp bin/client debian2:/
    root@ubuntu:~/docker/unix-domain-socket-example# docker ps
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
    d92cea9a459c        debian              "bash"                   2 minutes ago       Up 2 minutes                            debian2
    b1a3bef38722        debian              "bash"                   4 minutes ago       Up 4 minutes                            debian
    176fb79cdcef        nginx:1.17.4        "nginx -g 'daemon of…"   3 weeks ago         Up 3 weeks          80/tcp              test-vm
    root@ubuntu:~/docker/unix-domain-socket-example# 

    run server

    root@b1a3bef38722:/# ./server
    recvfrom: iccExchangeAPDU
    root@ubuntu:~/docker/unix-domain-socket-example# docker exec -it debian bash
    root@b1a3bef38722:/# ls /data1/unix_domain/
    server.sock
    root@b1a3bef38722:/# 

    run client 

    root@d92cea9a459c:/# ./client
    sent iccExchangeAPDU
    receive 15 transmit good!
    root@d92cea9a459c:/# 

    宿主机上

    root@ubuntu:~/docker/unix-domain-socket-example# ls /data1/unix_domain/
    server.sock
    root@ubuntu:~/docker/unix-domain-socket-example# docker exec -it debian bash
    root@b1a3bef38722:/# ls /data1/unix_domain/
    server.sock
    root@b1a3bef38722:/# 

    一对多

    server

    root@ubuntu:~/docker# docker run -it --name debian_s  -v /data1/unix_domain:/data1/unix_domain debian
    root@c66e0ec0c311:/# ./server 
    recvfrom: iccExchangeAPDU
    recvfrom: iccExchangeAPDU
    root@ubuntu:~/docker# docker run -it --name debian_s  -v /data1/unix_domain:/data1/unix_domain debian
    root@c66e0ec0c311:/# ./server 
    recvfrom: iccExchangeAPDU
    recvfrom: iccExchangeAPDU
    recvfrom: /data1/unix_domain/client.sockclient2
    recvfrom: /data1/unix_domain/client.sockclient3
    recvfrom: /data1/unix_domain/client.sockclient2
    recvfrom: /data1/unix_domain/client.sockclient3

    client1

    root@ubuntu:~/docker# docker run -it --name debian2  -v /data1/unix_domain:/data1/unix_domain debian
    root@7369904e52f4:/# ls
    bin  boot  client  data1  dev  etc  home  lib  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
    root@7369904e52f4:/# ./client client2
    sent iccExchangeAPDU
    receive 15 transmit good!
    root@7369904e52f4:/# ./client client2
    sent /data1/unix_domain/client.sockclient2
    receive 15 transmit good!

    client2

    root@ubuntu:~# docker run -it --name debian3  -v /data1/unix_domain:/data1/unix_domain debian
    root@6373fc51aeae:/# ./client client3
    sent iccExchangeAPDU
    receive 15 transmit good!
    root@6373fc51aeae:/# ./client client3
    sent /data1/unix_domain/client.sockclient3
    receive 15 transmit good!

    查看套接字

    root@ubuntu:~# ls /data1/unix_domain/
    root@ubuntu:~# ls /data1/unix_domain/
    client.sockclient2  client.sockclient3  server.sock
    root@ubuntu:~# 

    client 代码

    unix-domain-socket-example

    #include <stdio.h>
    #include <sys/socket.h>
    #include <sys/un.h>
    #include "ipc.h"
    
    int main(int argc, char *argv[]) {
            int fd;
            struct sockaddr_un addr;
            int ret;
            char buff[8192];
            struct sockaddr_un from;
            int ok = 1;
            int len;
            char buffer[128];
    
            if ((fd = socket(PF_UNIX, SOCK_DGRAM, 0)) < 0) {
                    perror("socket");
                    ok = 0;
            }
    
            if (ok) {
                    memset(&addr, 0, sizeof(addr));
                    snprintf(buffer,sizeof(buffer)-1,"%s%s",CLIENT_SOCK_FILE,argv[1]);
                    addr.sun_family = AF_UNIX;
                    strcpy(addr.sun_path, buffer);
                    unlink(buffer);
                    if (bind(fd, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
                            perror("bind");
                            ok = 0;
                    }
            }
    
            if (ok) {
                    memset(&addr, 0, sizeof(addr));
                    addr.sun_family = AF_UNIX;
                    strcpy(addr.sun_path, SERVER_SOCK_FILE);
                    if (connect(fd, (struct sockaddr *)&addr, sizeof(addr)) == -1) {
                            perror("connect");
                            ok = 0;
                    }
            }
    
            if (ok) {
                    //strcpy (buff, "iccExchangeAPDU");
                    if (send(fd, buffer, strlen(buffer)+1, 0) == -1) {
                            perror("send");
                            ok = 0;
                    }
                    printf ("sent %s
    ", buffer);
            }
    
            if (ok) {
                    if ((len = recv(fd, buff, 8192, 0)) < 0) {
                            perror("recv");
                            ok = 0;
                    }
                    printf ("receive %d %s
    ", len, buff);
            }
    
            if (fd >= 0) {
                    close(fd);
            }
    
            getchar();
            unlink (buffer);
            return 0;
    }
  • 相关阅读:
    正则表达式在行首添加指定内容
    linux之find命令详解
    一次安装rpcbind失败引发的思考
    配置linux实现路由功能
    chkconfig命令详解
    1225 数数字
    蛇形填数 ------- 模拟水题
    开灯问题---------简单模拟
    单源最短路径
    图的表示方式
  • 原文地址:https://www.cnblogs.com/dream397/p/15079844.html
Copyright © 2020-2023  润新知