簡體   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