UNIX域套接字编程3个套接字

麦可

我正在尝试制作一个支持3个套接字的server.c文件,这些套接字由3个相应的客户端类表示:client1,client2,client3。

在我的server.c文件中,我当前拥有在互联网上找到的这段代码。

如果我想使其具有3个插槽。我想使用select()命令查看3个客户端的写入活动。我的问题是如何使用它来支持3个插槽。

我可以将3个客户端绑定到服务器可以收听的3个套接字吗?如果是这样,服务器如何分别监听这三个套接字?用数组可能吗?

#include <stdio.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <stdlib.h>

#define socket1 "sock1"
#define socket2 "sock2"
#define socket3 "sock3"

int main(int argc, char *argv[]) {
    //struct sockaddr_un addr;
    struct sockaddr_un addr1;
    struct sockaddr_un addr2;
    struct sockaddr_un addr3;
    char buf[100];
    int socket1;
    int socket2;
    int socket3;
    //int fd;
    int cl,rc;

    if (argc > 1) socket_path=argv[1];

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

    memset(&addr1, 0, sizeof(addr1));
    addr1.sun_family = AF_UNIX;
    strncpy(addr1.sun_path, socket_path, sizeof(addr1.sun_path)-1);

    unlink(socket_path1);

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

    memset(&addr2, 0, sizeof(addr2));
    addr1.sun_family = AF_UNIX;
    strncpy(addr2.sun_path, socket_path, sizeof(addr2.sun_path)-1);

    unlink(socket_path2);

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

    memset(&addr3, 0, sizeof(addr3));
    addr3.sun_family = AF_UNIX;
    strncpy(addr3.sun_path, socket_path, sizeof(addr3.sun_path)-1);

    unlink(socket_path3);

    if (bind(socket1, (struct sockaddr*)&addr1, sizeof(addr1)) == -1) {
        perror("bind error");
        exit(-1);
    }

    if (bind(socket2, (struct sockaddr*)&addr2, sizeof(addr2)) == -1) {
        perror("bind error");
        exit(-1);
    }

    if (bind(socket3, (struct sockaddr*)&addr3, sizeof(addr3)) == -1) {
        perror("bind error");
        exit(-1);
    }

    if (listen(socket1, 5) == -1) {
        perror("listen error");
        exit(-1);
    }

    if (listen(socket2, 5) == -1) {
        perror("listen error");
        exit(-1);
    }

    if (listen(socket3, 5) == -1) {
        perror("listen error");
        exit(-1);
    }

    while (1) {
        if ( (cl = accept(fd, NULL, NULL)) == -1) {
            perror("accept error");
            continue;
        }

        while ( (rc=read(cl,buf,sizeof(buf))) > 0) {
            printf("read %u bytes: %.*s\n", rc, rc, buf);
        }
        if (rc == -1) {
            perror("read");
            exit(-1);
        }
        else if (rc == 0) {
            printf("EOF\n");
            close(cl);
        }
    }

    return 0;
}
尼古拉·费迪索夫(Nikolai Fetissov)

如果要在同一过程中使用三个侦听套接字,则必须使它们唯一。AF_INET家庭中,您可以通过对bind(2)不同的端口进行操作,在AF_UNIX家庭中,您可以通过不同的路径进行操作。

还有你的行:

char *socket_path = "\0hidden";

至少有两个问题:

  • 赋值右侧的字符串文字的类型为const char[8],它会衰减为const char*指针类型,而不是char*类型。使左手边const char*另外,请以更高的警告级别进行编译,例如-Wall -pedantic从编译器获取帮助。
  • 字符串开头的零字节使它不会复制任何内容strncpy(3) copies at most n characters from the string pointed to by src, including the terminating null byte ('\0')

创建一个函数,该函数将UNIX路径作为参数,并创建,绑定套接字并将其标记为侦听,并返回创建的套接字描述符。调用它三遍-您有三个侦听UNIX套接字。设置select(2)它们以进行阅读-会在客户端连接到达时告诉您。此时,调用accept(2)活动套接字以获取已连接的客户端套接字,该客户端套接字与侦听套接字本身是独立的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章