2019q1 Homework5 (daemon)
contributed by < njjack
>
問題:輸出亂碼
參考作業說明 daemon,按步驟測試
- 載入編譯好的 module
fastecho
$ telnet localhost 12345
- 輸入任意字串,回傳結果除了 input 之外還有亂碼
Image Not Showing
Possible Reasons
- The image file may be corrupted
- The server hosting the image is unavailable
- The image path is incorrect
- The image format is not supported
Learn More →
檢視 printk 印出的 buf
內容,顯然不只有 input 內容
Image Not Showing
Possible Reasons
- The image file may be corrupted
- The server hosting the image is unavailable
- The image path is incorrect
- The image format is not supported
Learn More →
文字訊息不要用螢幕截圖的方式呈現,不然日後很難檢索。
Image Not Showing
Possible Reasons
- The image file may be corrupted
- The server hosting the image is unavailable
- The image path is incorrect
- The image format is not supported
Learn More →
jserv
印出 buf
在 呼叫 get_request
前後的內容,比較兩者發現有相同的"亂碼",因此亂碼和傳輸過程無關,只是記憶體未經初始化的原有內容。暫時先藉由設置結束符解決輸出亂碼的問題
kernel_recvmsg
: The returned value is the total number of bytes received, or an error.
Image Not Showing
Possible Reasons
- The image file may be corrupted
- The server hosting the image is unavailable
- The image path is incorrect
- The image format is not supported
Learn More →
乍看解決了輸出的問題,但印出的 buf
結果其實還包含了多餘的換行,且若印出 length
的值,可以發現實際 receive 的 byte 數比 input 的 byte 數還要多 2
問題:重新載入 module 錯誤
結束 telnet 連線並移除 module fastecho
,重新再載入 module fastecho
時會失敗
嘗試更改預設 port 值 DEFAULT_PORT
,發現編譯後的 module 可以成功載入,猜測是沒有正常釋放 port
實際觀察發現 port 被佔用但沒有列出 process 的 pid ,狀態顯示為 CLOSE_WAIT
參考浅谈CLOSE_WAIT,被動關閉連線的一方(在此為server)卡在 CLOSE_WAIT
狀態,其中一個原因在於 server 沒有即時送出 FIN ,而 client 等不到回應直接結束
Image Not Showing
Possible Reasons
- The image file may be corrupted
- The server hosting the image is unavailable
- The image path is incorrect
- The image format is not supported
Learn More →
(圖取自同篇文章)
交叉參照 重新實現reuseport邏輯,實現一致性hash
Image Not Showing
Possible Reasons
- The image file may be corrupted
- The server hosting the image is unavailable
- The image path is incorrect
- The image format is not supported
Learn More →
jserv
原程式碼函式 echo_server_worker
持續呼叫 get_request
和 send_request
來接收傳遞訊息
嘗試將跳出 while 迴圈後最後一次 get_request
和 send_request
的呼叫註解掉
可以觀察到 client 中斷連線後狀態來到 TIME_WAIT
,而 server 已經 closed, 依TCP 關閉連線程序此為正常結果
(待補)client 卡在 FIN_WAIT_1 而不是 FIN_WAIT_2