【问题标题】:Can I have more than one socket file descriptor per client?每个客户端可以有多个套接字文件描述符吗?
【发布时间】:2021-01-10 02:33:36
【问题描述】:

我正在编写一个服务器程序和一个客户端程序。由于客户端进程可以是无限的(只有在中断后才结束),所以我想我可以在客户端进程中创建一个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;
}

【问题讨论】:

    标签: c sockets


    【解决方案1】:

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

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

    【讨论】:

    • 尝试对服务器文件描述符执行write() 时是否也返回0?
    • @AlfaCoding,不,这将返回 -1 表示错误
    【解决方案2】:

    另一种方法是使用signal.h库:客户端进程将自己中断并在接收到服务器进程发送的信号时调用您指定的函数

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-09
      • 1970-01-01
      • 2020-12-03
      • 2013-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-15
      相关资源
      最近更新 更多