2013-04-05 178 views
1

我的應用程序是一個多用戶聊天室。服務器只是將收到的消息發送給所有客戶端(與所有客戶端進行呼應,包括接收到消息的客戶端)。tcp聊天客戶端同步

對於每一個客戶端,任務是:

  1. 提示
  2. 採取用戶輸入
  3. 發送用戶寫入服務器

消息與此同時,各客戶需要:

  1. 接收數據(如果Y)從服務器
  2. 打印到控制檯

爲了實現上述我嘗試使用fork()邏輯如下:

pid = fork(); 
if(!fork()){ 
    while(1){ 
     memset(recvmsg,0,RCVBUFSIZE); 
     read(conn_s, recvmsg, RCVBUFSIZE); 
     printf("\n>%s",recvmsg);   
    } 
} 
else{ 
    while(1){ 
     printf("\n%d> ", conn_s); 
     memset(msg,0,RCVBUFSIZE); 
     fgets(msg, RCVBUFSIZE, stdin); 

     strrep(msg,'\n','\0'); 
     write(conn_s, msg, strlen(msg)); 

     if(strcmp(msg,"quit") == 0){ 
      kill(pid, SIGKILL); 
      exit(0); 
     } 
    } 
} 

問題是,第一客戶端進入之後的消息回送,msg不打印。客戶端輸入下一條消息時,會打印最後一條消息。

當連接了多個用戶時,程序表現不一致。它將接收到的消息堆疊起來,並將它們全部打印在一行中。

我嘗試使用select()poll(),但程序行爲每次都有所不同。

當沒有收到進入回顯信息的第一條消息,並且從下一個消息接收到最後一條消息時。因此當有多個用戶時就會搞砸了。

+1

我不認爲這是在常規緩衝控制檯輸出之上執行此操作的好方法。你應該看看像ncurses這樣的庫來獲得更低級別的控制檯I/O,從而可以將其與套接字I/O混合使用。 – unwind 2013-04-05 14:39:15

回答

0

您可能會喜歡使用setbuf(stdout, NULL);來關閉(行)緩衝stdout,看看事情是否看起來更好。