文章定位:寫坑+敘述
lab分爲三步:
第一步:深度參考tiny.c,再自己改改就行,驗證的非常粗略,我還寫了很多RFC 1945裏面關於細節的check,並用於火狐的代理,看到自己寫的東西起碼能用起來,還是很開心的。
第二步:沒實際內容,只要第一步寫好,改成多線程還是挺簡單的。(沒在這一步遇到困難)
第三部:自己寫cache,LRU,我用的是帶頭結點的雙向鏈表,尾插。還要加鎖pthread_rwlock。
pthread_rwlock用法:
函數定義:https://docs.oracle.com/cd/E19455-01/806-5257/6je9h032u/index.html
鎖定義:pthread_rwlock_t rwlock = PTHREAD_RWLOCK_INITIALIZER;
初始化鎖:pthread_rwlock_init(&rwlock, NULL);
申請獲得讀鎖:pthread_rwlock_rdlock(&rwlock);
申請獲得寫鎖:pthread_rwlock_wrlock(&rwlock);
無論是讀鎖還是寫鎖,用完以後要釋放:pthread_rwlock_unlock(&rwlock);
坑1(write-up):一直說要看RFC 1945,看完以後,發現並沒啥用。還仔細看了兩天。
坑2(火狐代理):習慣性的用www.baidu.com測試,但是百度用的是http/1.1 connect方法。我只實現了GET方法,後來用學校主頁測試,效果很好。
坑3(從連接中讀內容):兩種函數帶緩存的和不帶緩存的。先用了帶緩存的(rio_readlineb),後用了一個不帶緩存的(rio_readn),結果,後面那個函數就讀不到數據,因爲數據已經被讀到緩存裏了。(好吧,這個錯誤的確有點腦殘。後面用不帶緩存的,覺得沒啥必要用緩存)
坑4(pthread_rwlock):一個線程,不能同時擁有讀鎖和寫鎖,一定要先釋放一種鎖,再申請另一種鎖。
坑5(有些迴應沒有content-length頭部):讀完頭部以後,就一直讀到EOF標識。這樣的讀法,同時解決二進制數據接收問題。
個人錯誤:
1. m = (rio_writen(fd, buf, n)) == n --> (m = rio_writen(fd, buf, n)) == n
2. 給char 指針賦值,傳入了char * --> 傳入char ** (已經不是第一次了,屢教不改)
3. 更多其他....
自動測試其實很粗略,感覺很多點都沒有測試到。