首页 > 解决方案 > 每个客户端可以有多个套接字文件描述符吗?

问题描述

我正在编写一个服务器程序和一个客户端程序。由于客户端进程可以是无限的(它只在中断后结束),我想我可以在客户端进程中创建一个thread在服务器进程断开连接时断开自身,因此服务器可以向客户端发送消息以断开连接客户也是。

这里的问题是,将客户端连接到服务器只返回一个套接字文件描述符,当服务器断开连接并使用套接字缓冲区中的一些数据时,它可以使用,因此会对程序的主要目的产生负面影响,所以我想对服务器使用另一个套接字文件描述符来断开连接thread。我怎样才能做到这一点?

这是我用来连接两个进程的函数:

服务器:

int socketConfig (connection_info cinfo) {

    int socketfd = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP);

    if (socketfd < 0) {
        write(1, "Socket error\n", strlen("Socket error\n"));
        return -1;
    }

    struct sockaddr_in s_addr;
    memset (&s_addr, 0, sizeof (s_addr));
    s_addr.sin_family = AF_INET;
    s_addr.sin_port = htons(cinfo.port);
    s_addr.sin_addr.s_addr = INADDR_ANY;

    if (bind (socketfd, (void *) &s_addr, sizeof (s_addr)) < 0) {
        write(1, "Bind error\n", strlen("Bind error\n"));
        return -1;
    }

    listen(socketfd, 3);

    return socketfd;
}

int receiveClient(int serverfd) {
    struct sockaddr_in client;
    socklen_t len = sizeof(client);

    return accept(serverfd, (void *) &client, &len);
}

客户:

int connect_to_server(Config config) {
    struct sockaddr_in client;
    int sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

    write(1, "Connecting Jack...\n", strlen("Connecting Jack...\n"));

    if (sockfd < 0) {
        write(1, "Error creating the socket\n", strlen("Error creating the socket\n"));
        return -1;
    }

    memset(&client, 0, sizeof(client));

    client.sin_family = AF_INET;
    client.sin_port = htons(config.port_jack);

    if (inet_aton(config.ip_jack, &client.sin_addr) == 0) {
        write(1, "Invalid IP address\n", strlen("Invalid IP address\n"));
        return -1;
    }

    if (connect(sockfd, (void *) &client, sizeof(client)) < 0) {
        write(1, "Error connecting to Jack\n", strlen("Error connecting to Jack\n"));
        return -1;
    }

    return sockfd;
}

标签: csockets

解决方案


服务器在关闭连接时不需要“发送消息”,TCP/IP 堆栈会为您执行此操作。

那么客户端在进行读取的时候会收到0个字节来表示对方关闭了连接。不需要单独的插座。


推荐阅读