• 程式碼趨近完成,寒假的課題終於也算是接近告一個段落了。

多人的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平台!!

 

nobodyzxc 發表在 痞客邦 留言(0) 人氣()