C ++服务器/客户端聊天程序

时间:2018-04-30 07:11:59

标签: c++ sockets network-programming

我正在研究服务器 - 多客户端聊天程序,并创建了一个方法,可以将服务器输入的输入打印到其各自的客户端。

方法:

void *admin_handler (void *ptr) {
    char strBuf [100000];
    const char strExit [20] = "Server: terminated.";

    while(1) {
        scanf ("%s", strBuf);
        int i;
        for (i=0; i < nClient; i++){
            if (strcmp(strBuf,"Exit") == 0){
                write (nFDList [i], strExit, strlen (strExit) + 1);
                quick_exit (EXIT_SUCCESS);
            }
            else {
                write (nFDList [i], strBuf, strlen (strBuf) + 1);
            }
        }
    };
}

但是,当我在服务器端输入“Exit”时,它只会打印“Server:terminated”。到我打开的第一个客户端,当我输入任何其他内容时,它会将消息从服​​务器打印到所有客户端。如何让服务器将strExit打印到所有客户端,如strBuf?

注意:nFDList [i]是一个存储客户端的数组。

2 个答案:

答案 0 :(得分:0)

要打印“服务器:已终止”。对于所有客户,我必须按如下方式修改我的代码:

void *admin_handler (void *ptr) {
    char strBuf [100000];
    const char strExit [20] = "Server: terminated.";
    while(1) {
        scanf ("%s", strBuf);
        int i;
        for (i=0; i < nClient; i++){
            if (strcmp(strBuf,"Exit") == 0){
                for (i=0; i < nClient; i++){
                    write (nFDList [i], strExit, strlen (strExit) + 1);
                }
                quick_exit (EXIT_SUCCESS);
            }
            else {
                write (nFDList [i], strBuf, strlen (strBuf) + 1);
            }
        }
    };
}

答案 1 :(得分:0)

正如您正确指出的那样,发送正常消息和关闭消息之间的唯一区别是发送中使用的文本,然后您可以通过仅发送一次来“制作真实的内容”逻辑,并操纵输入。

这是一个更干的建议替代方案:

void *admin_handler (void *ptr) {
    char strBuf [100000];
    char flagExit = 0;
    const char strExit [20] = "Server: terminated.";
    while(1) {
        scanf ("%s", strBuf);

        if (strcmp(strBuf, "Exit") == 0){
            strncpy(strBuf, strExit, strlen(strExit));
            flagExit = 1;
        }

        int i;
        for (i=0; i < nClient; i++){
            write (nFDList [i], strBuf, strlen (strBuf) + 1);
        }

        if (flagExit) {
            quick_exit (EXIT_SUCCESS);
        }
    }
}