1. 程式人生 > >2018-2019-1 20165312 實驗三 實時系統

2018-2019-1 20165312 實驗三 實時系統

linux命令 net 代碼 close 單詞數 技術 ref 進行 顯示

2018-2019-1 20165312 實驗三 實時系統

任務一

  • 學習使用Linux命令wc(1)
  • 基於Linux Socket程序設計實現wc(1)服務器(端口號是你學號的後6位)和客戶端
  • 客戶端傳一個文本文件給服務器
  • 服務器返加文本文件中的單詞數

問題1:什麽是wc(1)命令?

首先使用man wc了解功能

技術分享圖片

可得知,wc命令計算每個文件的行數、字數、字節數。

技術分享圖片

可得知,wc各個參數的作用如下:

  • wc -c統計文件字節數。
  • wc -m統計字符數
  • wc -l統計行數
  • wc -w統計字數
  • wc -L打印最長行的長度
  • wc -help顯示幫助信息
  • wc -version顯示版本信息

問題2:什麽是socket編程?客戶端和服務器之間如何進行數據傳輸?

socket編程的基本函數有socket()bind()listen()accept()send()sendto()recv()以及recvfrom()等,其中根據客戶端還是服務端,或者根據使用TCP協議還是UDP協議,這些函數的調用流程都有所區別。

技術分享圖片

本題目我使用TCP協議,即采用面向無連接的SOCKET

運行截圖

技術分享圖片

任務二

  • 使用多線程實現wc服務器並使用同步互斥機制保證計數正確
  • 上方提交代碼
  • 下方提交測試
  • 對比單線程版本的性能,並分析原因
運行截圖

技術分享圖片

遇到的問題及解決方法

  • 在虛擬機中查詢ip地址時出現未安裝

技術分享圖片

sudo apt install net-tools安裝過之後,查詢ip為127.0.0.1

技術分享圖片

  • 運行server.c時gcc server.c -o server -lpthread出現之下錯誤

技術分享圖片

使用man close查找close功能,發現缺少函數所對應的頭文件,添加之後即正常運行。

技術分享圖片

  • 運行client.c時gcc client.c -o client -lpthread出現以下錯誤

技術分享圖片

缺少close函數所對應的頭文件同上一個錯誤,使用man gets查找gets功能

技術分享圖片

gets函數所對應的頭文件已存在,說明不是這個問題。就尋求另外一個解決方法。接著man fgets查詢fgets功能

技術分享圖片

用fgets函數替換gets函數即可

參考:warning: the ‘gets‘ function is dangerous and should not be used.的解決辦法
  • 運行client.c時gcc client.c -o client -lpthread出現以下錯誤

技術分享圖片

man inet_aton查詢此函數的功能

技術分享圖片

添加缺少的頭文件即可以運行

2018-2019-1 20165312 實驗三 實時系統