Socket文件傳輸過程詳解

   今天寫了一個文件傳輸工具。但是之前沒有寫過。就從網上學習了一下。掌握了大致的步驟。 

第一階段:Socket連接

服務器端(發送文件):首先打開文件【fopen】,用rb方式打開,既可以發送文本文件,也可以發送二進制文件,在無錯時初始化套接字socket,即初始化socket庫【WSAStartup】,分配socket【socket】,填充服務器的地址,即填充sockaddr_in結構,然後進行綁定【bind】,設置套接字爲監聽套接字【listen】,接收連接【accept】,至此服務器阻塞,等待客戶端的連接。

         客戶端(接收文件):首先打開文件【fopen】,用wb方式打開,在無錯時初始化套接字socket,即初始化socket庫【WSAStartup】,分配socket【socket】,填充客戶端的地址,即填充sockaddr_in結構,然後進行綁定【bind】,再填充服務器的地址結構,然後調用【connect】進行連接,當連接成功後,的工作便結束了。

    第二階段:文件發送。

    服務器端:使用循環while,結束條件是(!feof(fp)),fp是文件指針,feof檢測當前的文件讀取指針是否到達文件尾部,若到達了就返回真,否則返回假。然後在循環內部依次調用【fread】、【send】進行發送。這裏有一個問題需要注意,調用fread的時候有兩個參數是要每次讀多少字節和讀多少次,將第一個設置爲1,將第二個設置爲緩衝區的大小,用一個變量記錄實際讀到多少字節,即【fread】的返回值,然後將其傳遞給【send】,就可以實現發送文件了,在發送完成後斷開連接【closesocket】,關閉文件【fclose】。

    客戶端:使用while死循環,調用【recv】接收文件,【fwrite】寫入文件,這裏也有個和上面類似的問題,就是要將recv的返回值傳遞給fwrite的第三個參數,即受到了多少字節,就向文件中寫多少字節。當recv返回值爲0時(連接斷開時)退出循環,【closesocket】關閉套接字,調用【fclose】關閉文件。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章