實現功能:Ubuntu上通過多線程實現服務器並發給客戶端發送文件,攜帶包頭,根據包頭信息命名新文件。適用於短連接。
問題小結:
01. 調用嵌套在結構體中的結構體char 數組成員時,需要動態分配內存。
02. 使用select() 監聽socket變化。select() 其中三個參數分別監聽讀,寫,出錯。
03. 每條線程在同時發送文件時,需要使用獨立的變量,如accept(), FILE *fd, *buff 等,用結構數組 + 標號實現。
04. struct stat stat_buff.st_size 可得到文件的字節大小。
05. 文件使用“wb+” 創建之后寫數據用“rb+" 。
*06. 由於可能接收緩沖區存滿,本一次接收1096字節數據,結果分成兩次819和277字節,導致錯誤接收和解析,處理辦法為判斷每次接收到的數據是否攜帶包頭。
07. 多線程中,在主線程中某一動態分配的對象同時被兩個線程使用,一個線程釋放了該對象,而另一個線程繼續對該對象進行操作,會造成使用了無效指針錯誤。
08. 函數中的局部指針變量不可返回,只有靜態變量,全局變量,動態分配的指針變量可以返回。
**09. 創建線程函數中:
pthread_create(&st_up_manages[index].m_thread_attrs.m_tid, NULL,server_Thread, (void *)&st_up_manages[index]);
線程ID和線程函數的參數均需要獨立變量,由結構數組分別分配。
總結:熟悉了socket 創建以及收發過程;對c 語言中數組,指針,字符串操作,多線程理解加深;動態開辟的空間,創建的資源在程序退出(包括非正常)時要全部釋放;提高效率。
渺小如螻蟻,學習永無止境。
渴望把程序寫成藝術品,哈哈。