《linux操作系統(tǒng)-實驗九-Linux多線程文件傳輸實現(xiàn)》由會員分享,可在線閱讀,更多相關(guān)《linux操作系統(tǒng)-實驗九-Linux多線程文件傳輸實現(xiàn)(5頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、學 號
姓 名
專業(yè)、班
實驗地點
實 1-416
指導教師
實驗時間
2015.12.15
一、實驗?zāi)康募耙?
通過本實驗的綜合實踐,使學生掌握 Linux多線程、socket編程和文件系
統(tǒng)操作等多項知識。
以學生自主訓練為主的開放模式組織教學
二、實驗設(shè)備(軟硬件環(huán)境)及要求
安裝后Ubuntu系統(tǒng)的VMWare
三、實驗內(nèi)容與步驟
實驗內(nèi)容:Linux多線程文件傳輸實現(xiàn)
實驗步驟:
包括服務(wù)器和客戶端兩部分。
?6.1服務(wù)器端創(chuàng)建監(jiān)聽與文件管理
服務(wù)器負責的功能模塊主要有兩部分, 一是對連接進來客戶端所有線程的管
理和
2、服務(wù)器目錄下的文件管理;二是創(chuàng)建線程來單獨監(jiān)聽客戶端的動作。 為了使
于管理,創(chuàng)建兩個user.txt
和client.txt 兩個文檔來分別負責服務(wù)命的連接和
客戶端的連接。user.txt中存放了服務(wù)器名和密碼。client.txt 存放了連接客 戶端名字和密碼。
首先對服務(wù)器的創(chuàng)建有個監(jiān)測,即在啟動時先核實服務(wù)器的所有者 username 和密碼password,將輸入的用戶、密碼與user.txt中的用戶密碼比較,匹配成 功則同思啟動,否則return -1 表失敗。
接意創(chuàng)建一個socket套接口,綁止Ip設(shè)置客戶端的最大連接數(shù)為10,然后創(chuàng)
建一個sever線程來實現(xiàn)對
3、服務(wù)器本身監(jiān)聽動作。
接卜來創(chuàng)建線程完成對客戶端的監(jiān)聽
監(jiān)聽等待連接:
while(1)
實驗序號:9
《操作系統(tǒng)》實驗報告
實驗項目名稱:Linux多線程文件傳輸實現(xiàn)
sockdata = accept(sockfd,(struct sockaddr*)0,(int*)0);
我們定義結(jié)構(gòu)體:
struct client_t
{
pthread_t tid;
int conn_fd;
int used;
char name[20];
}p_client[10];
來存放每個客戶端的socket信息、線程標識、使用號、連接號和客戶名。創(chuàng)建 線程實現(xiàn)單
4、獨監(jiān)聽:
p_client[i].conn_fd = sockdata;
p_client[i].used = i;
strcpy(p_client[i].name , client_name);
pthread_create(&p_client[i].tid,NULL,&client_conn,&p_client[i])
接下來是線程client conn()的功能
監(jiān)聽客戶端的功能完成。
?6.2客戶端連接與文件傳輸
在客戶端這邊同樣適用了檢測機制,運行客戶機時要將用戶名、密碼以及ip 地址和端口號作為參數(shù)輸進來,先建立與服務(wù)器的連接,然后將用戶名和密碼發(fā) 送到服務(wù)端檢測,
5、如果檢測失敗則接收到一條拒絕信息, 連接斷開,如果檢測成 功則接收到一條確認信息,雙方通信開始。
?6.3實現(xiàn)步驟
基于多線程的TCP套接字文件傳輸通信工作流程圖,如圖 1所示。
通信工作的大致流程:
1) 服務(wù)器先用socket()函數(shù)來建立一個套接口,用這個套接口完成通
2) 服務(wù)器用bind()函數(shù)來綁定一個端口號和ip地址,是套接口與指定
的端口號和ip關(guān)聯(lián)。
3) 服務(wù)器調(diào)用listen()函數(shù),是服務(wù)器的端口和Ip處于監(jiān)聽狀態(tài),等
待網(wǎng)絡(luò)中某一個客戶機的連接請求。
4) 客戶機用socket()函數(shù)建立一個套接口,設(shè)定遠程ip和端口
5) 客戶機調(diào)用connec
6、t。函數(shù)連接遠程計算機指定的端口。
6) 服務(wù)器調(diào)用accept()函數(shù)來接受遠程計算機的連接請求,建立起與
客戶機之間的通信連接。
7) 建立連接之后,客戶機用 write()函數(shù)(或send())想socket中寫
入數(shù)據(jù)。也可以用read()函數(shù)(或recv()函數(shù))賭氣服務(wù)器發(fā)送來的數(shù)據(jù)。
8) 服務(wù)器用read()函數(shù)(或recv()函數(shù))來讀取客戶機發(fā)來的數(shù)據(jù),
也可以用write()函數(shù)(或send()函數(shù))來發(fā)送數(shù)據(jù)。
9) 完成通信以后,使用close()函數(shù)關(guān)閉socket連接。
客戶機進程 服務(wù)器進程
圖1 TCP套接字通信工作
四、實驗結(jié)果、
7、數(shù)據(jù)處理與過程截圖
1 .打開兩個終端分別作為服務(wù)器端和客戶端
2 .在服務(wù)器端程序編譯
gcc -o server server.c
服務(wù)器端程序的運行,在一個終端執(zhí)行
./ serve
nlngmo(aut)untu :vl client.c
nlngmogubuntu:gcc -o client client.c
ningmogubuntu:~S ./client 127.0.0.1
Please Input File Name On Server: sh
File: 5h Can Not Open To Write
3 .在客戶端程序編譯
gcc -o clie
8、nt client.c
客戶端程序的運行,在另一個終端中執(zhí)行
./client 127.0.0.1 (通過 127.0.0.1 訪問自己)
ningmo@ubuntui:-/t€St/test9$ vi sarver.c
ningmo@ubuntu:*/test/test9$ gcc -o server server.c ningmo@ubuntu:"/test/test9$ ?/server
File: sh Not Found
因sh文件目錄不在服務(wù)器下所以傳送失敗
4 .傳送服務(wù)器下的test.txt 文件
ningmo^ubuntu:J client 127.6,9.1
9、
Please Input File Name On Server: test.txt
Recieve File: test.txt From Server[127,0,0,1] Finished
ningmo@ubuntu:Is 54< Desktop rect.sh~ test,txt
傳送成功,test.txt 文件出現(xiàn)在客戶端的目錄下
iingno@ubuntu:-/test/test9s Is server server.c test * txt ^ingmo^ubuntu:-/test/test9s ./server file_block_length = 6 FiLe; test,txt Transfer Finished
五、思考題
六、教師評語 成績
簽名:
日期: