2012-05-11 17 views
1

我必須用C寫一個簡單的聊天。一個程序是客戶端連接的服務器,它管理他們發送的消息。客戶端是另一個程序,在這裏我遇到了問題。我希望能夠接收來自其他客戶端的消息(通過服務器)並在控制檯輸出中打印它們。然而,同時我希望能夠編寫自己的消息並將其發送到服務器(並因此發送給其他客戶端)。
問題是,當我寫一些消息時,同時從服務器接收一個消息,整個輸入就會混亂。我想以某種方式分離消息輸出區域和消息輸入區域。有沒有什麼好的方法可以做到這一點?這是我在客戶端程序叉(仍然是一個草案):基於控制檯的聊天。如何分離消息和輸入?

int pid = fork(); 
if(pid==0){ 
    do{ 
     scanf("%s", msg); 
     printf("sending the message to the server\n"); 
    } while(strcmp(msg, "exit")); 
    kill(getppid(), SIGKILL); 
    printf("kill the child\n"); 
} else { 
    while(1){ 
     printf("receiving a new message\n"); 
     sleep(1); 
    } 
} 

編輯:
好吧,我做了一個簡單的ncurses的應用程序,但有一個更的問題。當我有兩個進程(在fork()之後)時,如何在ncurses中寫入同一個窗口?他們似乎有他們單獨的窗口,我可以提供輸入或從服務器讀取輸出,但不能在一個屏幕上。任何建議?我不想在它們之間建立IPC,只是在客戶端和服務器之間。

編輯2:
我終於放棄了ncurses的想法,由於接近的截止日期。如果程序是多線程的(不是多處理的),那麼它可以很好地工作,但是使用fork的時候它變得一團糟。無論如何,這是我最後的項目中的ncurses,所以仍然是一個有用的建議:)

+0

你有沒有考慮過使用ncurses? – dwalter

+0

您可以查看舊的unix [talk](ftp://ftp.irisa.fr/pub/OpenBSD/src/usr.bin/talk/)命令的源代碼以選擇一些想法。 – mouviciel

回答

2

你不提,無論你在Windows或Linux ......這個答案假定的Linux,在大多數情況下。

一個典型的解決方案是使用諸如ncurses之類的東西將屏幕分隔成兩個「窗口」,然後在一個窗口中顯示從其他客戶端收到的消息,並在另一個窗口中顯示您的輸入。 Curses是一個庫,用於利用終端控制代碼進行遊標定位等,以提供一個簡單的基於控制檯的GUI。

如果你曾經使用過的irc客戶端,你已經經歷過類似的東西是什麼我描述。

有一個ncurses programming HOWTO,這可能是一個良好的開端。

+0

我在Linux上。我會嘗試這個howto,看起來是一個很好的建議。謝謝。如果它能工作,我會在後面寫。 – Wojtek