繁体   English   中英

服务器进程等待客户端输入/消息的最佳方法是什么

[英]What is the best way for a server process to wait for client input/messages

抱歉,如果这个问题看起来有点开放或太模糊,我不是最好的C / Cpp程序员(任何一种语言都可以解决这个问题)。

假设有两个正在运行的进程,一个客户端和一个服务器(它们也可以被视为生产者和消费者,但我认为客户端和服务器可能在这里更好)。 服务器是客户端的“子”(类似于,见下文)进程,以便创建它以稍微作为卸载。 随着时间的推移,客户端会生成多个作业,然后将其卸载到它创建的服务器上。 根据作业,服务器可能会或可能不会向客户端发送有关作业完成的信息。 另外,有些人可能会建议可以通过线程来完成。 由于我不会进入的原因,线程在这里不起作用。 客户端和服务器不应该共享内存(可能有也可能没有共享内存,客户端和服务器可能是两台不同的机器:我写的代码应该支持这两种可能性)。

服务器具有非常长的初始化期,因此必须始终运行,因此第二个进程的概念是服务器。 因此,它必须始终监听来自客户端的任何消息。 下面给出一个简单的伪代码/ C示例

int main() {
    ...
    client_pid = getpid();
    pid = fork();
    if(pid > 0) {
        /* sets up connection with client, based on what connection type has been
         * given (shared memory, sockets, etc).  I don't know anything   
         * about what type of connection is established only that all
         * communication is handled by the wait_For_Jobs and generate_Jobs functions
        */
        start_Server(client_pid, connection_type);
        wait_For_Jobs();
    } else {
        // gets information needed to send messages to server
        contact_info = wait_for_connection(); 
        generate_Jobs(contact_info);
    }
}

这是我想要的非常粗略的轮廓。 我的问题与“wait_For_Jobs”功能有关。 不幸的是,connection_type直到运行时才会知道,因此这个问题可能有几个不同的答案,具体取决于使用的通信方法类型(即共享内存,套接字等)。 为简单起见,假设共享内存是正在使用的通信类型(比如boost interprocess)。 考虑到这一点,服务器等待来自客户端的输入的最佳和最有效的方法是什么? 一种可能的方法是以下面给出的方式稍微使用while循环。

void wait_For_Jobs() {
    while(true) {
        if(check_If_Message_Received_Over_Shared_Memory){
            // handle message
        }
    }
}

但是,我怀疑这将是非常低效的; 这个过程总是“旋转它的轮子”。 稍微修复的方法是将进程在while循环结束时“休眠”一段时间。 这与在while循环中运行代码并没有太大区别(实际上它是相同的); 它只是以牺牲响应时间为代价来降低资源使用量。 理想情况下,该过程应该处于待机模式,并在收到消息后开始计算。 但是,我不确定你会怎样在C或Cpp中做这样的事情。 考虑到这一点,有更好的选择吗?

如果使用共享内存,则需要阻止在出现另一个请求时引发的信号量。

如果使用套接字,请使用阻塞接收。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM