1
我的應用程序是一個多用戶聊天室。服務器只是將收到的消息發送給所有客戶端(與所有客戶端進行呼應,包括接收到消息的客戶端)。tcp聊天客戶端同步
對於每一個客戶端,任務是:
- 提示
- 採取用戶輸入
- 發送用戶寫入服務器
消息與此同時,各客戶需要:
- 接收數據(如果Y)從服務器
- 打印到控制檯
爲了實現上述我嘗試使用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()
,但程序行爲每次都有所不同。
當沒有收到進入回顯信息的第一條消息,並且從下一個消息接收到最後一條消息時。因此當有多個用戶時就會搞砸了。
我不認爲這是在常規緩衝控制檯輸出之上執行此操作的好方法。你應該看看像ncurses這樣的庫來獲得更低級別的控制檯I/O,從而可以將其與套接字I/O混合使用。 – unwind 2013-04-05 14:39:15