在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