【小練習】windows與linux進行socket文件傳輸

在Windows與Linux使用socket通信基礎上,添加文件傳輸功能,需要進行簡單的交互。

目錄

  • 程序效果
  • 實現流程
  • 樣例代碼
  • 測試用例
  • 參考資料

程序效果

Windows客戶端可以從Linux服務器端索要文件,也可以發送文件至Linux服務器端。

代碼指定兩側的接收目錄分別爲

“d:/download/”和“/other/download/”

實現流程

關鍵交互的節點主要有5個:

(1)客戶端發送需要使用的功能至服務器端:“1”表示從服務器端接收文件;“2”表示發送文件至服務器端。

(2)客戶端發送文件名至服務器端。

(3)服務器端返回該文件讀取/寫入是否成功的結果給客戶端。

(4)客戶端發送本端該文件寫入/讀取是否成功的結果給服務器端。

(5)3、4均正常的前提下,客戶端發送文件/接收文件。

樣例代碼

下載鏈接:

https://download.csdn.net/download/u013025955/11076917

2.部分主要流程

(1)Windows客戶端

int main(int argc, char *argv[])
{
    while (1)
    {
        //獲取用戶的操作,1表示接收文件,2表示發送文件給服務器
        scanf("%d", &choice);
   
        if (choice == 1)//從服務器接收文件
        {
            //開始通信
            send(connectSocket, "1", 1, 0);//向服務器發送一個標誌,說明是要從服務器接收文件
            send(connectSocket,file_name, 100, 0);

            //接收服務器端響應的結果,說明在服務器端是否打開該文件成功
            recv(connectSocket, &state, 1, 0);
            
            if (state == '1')//創建成功
            {
                fp = fopen(strcat(directory, file_name), "wb");
                
                if (fp == NULL)
                {
                    send(connectSocket, "0", 1, 0);//打開文件失敗,向服務器端發送標誌
                    continue;
                }
                else
                {
                    send(connectSocket, "1", 1, 0);//打開文件成功,向服務器端發送標誌

                    接收文件...
                    continue;
                }    
            }
        }
        else//向服務器發送一個文件
        {
            send(connectSocket, "2", 1, 0);//向服務器發送一個標誌,說明是要向服務器發送一個文件
            send(connectSocket, file_name, 100, 0);
    
            //接收服務器端響應的結果,說明用於接收該文件的同名文件在服務器端是否創建成功
            recv(connectSocket, &state, 1, 0);

            if (state == '1')//服務器創建文件成功,可以接收文件
            {
                fp = fopen(path, "rb");

                if (fp == NULL)
                {
                    send(connectSocket, "0", 1, 0);//讀取文件失敗,向服務器端發送標誌
                    continue;
                }
                else
                {
                    send(connectSocket, "1", 1, 0);//讀取文件成功,向服務器端發送標誌
                    
                    發送文件...
                    continue;
                }
            }
        }
    }
    return 0;
}

(2)Linux服務器端

void main(int argc, char* argv[])
{
    while (1)
    {
        //獲取客戶端請求的業務類型:“1”爲從服務器端獲取文件,“2”爲發送文件至服務器端
        read(newConnection, &state, 1);

        if (state == '1')
        {
            read(newConnection, file_recvname, 100);

            fp = fopen(strcat(directory_recv,file_recvname), "rb");

            if (fp == NULL)
            {
                write(newConnection, "0", 1);//讀取文件失敗,向客戶端發送標誌
            }
            else
            {                        
                write(newConnection, "1", 1);//讀取文件成功,向客戶端發送標誌

                //獲取客戶端狀況,是否成功創建文件,如果成功創建,服務器端就可以傳送
                read(newConnection, &state, 1);

                if (state == '1')
                {
                    發送文件...
                }
            }
        }
        else
        {
            read(newConnection, file_name, 100);

            fp=fopen(strcat(directory,file_name), "wb");

            if (fp == NULL)//服務器創建文件失敗,拒絕接收客戶端的文件
            {
                write(newConnection, "0", 1);//寫入文件失敗,向客戶端發送標誌
            }
            else
            {    
                write(newConnection, "1", 1);//寫入文件成功,向客戶端發送標誌

                read(newConnection, &state, 1);

                //接收客戶端響應的結果,說明客戶端要發送的文件是否讀取成功
                if (state == '1')
                {
                    接收文件...
                }
            }
        }

        // 並關閉監聽Socket,然後退出應用程序
        close(newConnection);
    }
    close(listeningSocket);
}

測試用例

參考資料

1.TCP實現windows和linux之間文件傳輸

https://download.csdn.net/download/yutianzuijin/4107567

2.fopen、popen 引起 Segmentation fault

https://www.jianshu.com/p/4d877f98a8c4

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