1. 程式人生 > >linux環境下的多人聊天程式設計

linux環境下的多人聊天程式設計

STEP 1:老師給出了原始的程式,是功能不完善的,也就是讓我們把發信息的使用者名稱和時間啥的顯示出來,這樣不是比較合理嘛;原程式是可以實現傳text的,就是沒有使用者名稱而已。

先跑一下(切換到你放這三檔案的目錄哦~):gcc -o chat chat.c 回車

然後:./chat 回車

再開一個終端:telnet 127.0.0.1 9999 回車

username:1 回車

再開一個終端:telnet 127.0.0.1 9999 回車

username:2 回車

tell 1 hello 回車

然後1那個終端就收到訊息啦,也可以chat hello everyone 回車

這樣相當於群聊,所有人都能收到訊息,不指定某人。

STEP 2:改程式碼(加程式碼)

經我閱讀程式碼後,決定修改chat.h裡的tell_someone這個函式先,

看114行writen(chater[index].sock_fd ,new_data_p,n)==-1

就是說把new_data_p這個字串寫到套接字裡,執行完這條語句之後其他人的終端就會顯示出new_data_p了,所以我們把username加到這個字串裡就可以,主要用的是strcat和strcpy函式。

在tell_someone這個函式裡,data_p就是原本要傳送的訊息(我們就是改造成username : data_p),chater[slot_index].user_id是傳送者的username,new_data_p就是我們新構建的字串,構造它的過程就是106~109行。

其中我犯得錯誤是一開始把new_data_p定義成了char *型別,然後把chater[slot_index].user_id的值賦給它了,後來我發現這是這指標型別,如果這樣賦值,相當於把chater[slot_index].user_id的指標賦值給了new_data_p,那麼new_data_p和chater[slot_index].user_id相當於公用一個地址了,那麼也就是說我們如果修改new_data_p的值,實質上是那個地址裡存的值改了,chater[slot_index].user_id是指向那個地址的,那麼間接地就修改了chater[slot_index].user_id的值,也就是修改了username啊!那麼我們再找原來的username為1或者2,就找不著了,而且它實際變成了new_data_p(想想一下一個使用者名稱叫   "1 :hello  回車"  是不是醉了……);然後就把它定義成char[]了,這樣就是取值而不是取地址了,然後用strcat把username、 : 、data_p一步步往new_data_p里加,其中strcat(a,b),指的是把b加到a的末尾,所以要保證a有足夠的空間還能容納b哦!~

STEP 3:修改chat_all和tell_someone是一樣的,一共就改了三個地方,自己看看程式碼吧~如果想加上系統時間啥的,同理~

話說這個原理,還是大二上java實驗時候學到的……很意外地從老師和同學(三兒)那得到的思路,挺好的~就是把自己的使用者名稱和要傳送的訊息一起發給對方的做法~挺好的~覺得好有哲理哦~