發表文章

目前顯示的是 3月, 2016的文章

[C/C++] 多人聊天室

程式碼趨近完成,寒假的課題終於也算是接近告一個段落了。 多人的server其實也跟兩人版的差不多,不過就是要注意client資料的宣告,可以預留一個位置做拒絕用,當人數已達上限時,多一個位置,把人accept進來後sign給他人數已滿的訊息,繼而close掉。 這次在寫的過程中,一個bug de了很久,就是為client啟動執行緒時把參數傳入create_thread時,由於傳的是i的位址(我用迴圈跑客戶資料陣列),在傳進去被存為另一變數前,父程序的i已經又跑完迴圈i++了,所以傳進去的值會比原本多一,於是recv接到的是fd==-1的client,結果就發生錯誤喽。這bug我de了好幾個小時才發現,資質駑鈍啊~~~ 原先看這篇是教傳址: http://pthreadpthread.blogspot.tw/2012/03/pthread.html 後來這篇有另外教傳值: http://pccts.blogspot.tw/2007/11/pthreadcreate.html (*真是讓我@@) 所以歸納一下本篇和上篇的差異:要把程式分成兩部分伺服端和客戶端,客戶端沒甚麼不同,伺服端多了一個重點就是多執行緒的管理,開啟與關閉,關於伺服端接受資料也可以用select接,取代執行緒的建立,不過我還是偏好執行緒,因為select好像要一直跑迴圈,我怕造成負擔。 pthread_create()建立執行緒 pthread_exit()用於該執行緒內 將線程結束(如果用exit()會造成整個程式結束) pthread_cancel()將指定執行緒結束 //欲結束執行緒內加這句  pthread_setcanceltype (PTHREAD_CANCEL_ASYNCHRONOUS, NULL );  設置狀態 可參考: http://jyhshin.pixnet.net/blog/post/42432082-linux-pthread-cancel-part2 mycode都在github上喔~^^ 悄悄話:我發現學校主機直接run server端,外面連得上去,看來port並沒有特別鎖起來。 下一步,啊~~我想寫破解踩地雷的程式......轉戰windows平台!!