版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
Linu環(huán)境下基于TCPIP及Socket技術(shù)遠(yuǎn)程文件傳送控制編程報(bào)告.系統(tǒng)模塊分為服務(wù)器和客戶端兩部分, 客戶端實(shí)現(xiàn)對文件的上傳、 下載和查看服務(wù)器默認(rèn)路徑下的文件列表;服務(wù)器可以對文件進(jìn)行管理操作,包括創(chuàng)建、刪除和重命名等。多線程文件傳輸是一種一對多或者多對多的關(guān)系,一般是一個服務(wù)器對應(yīng)著多個客戶端??蛻舳送ㄟ^ socket連接服務(wù)器,服務(wù)器要為客戶端創(chuàng)建一個單獨(dú)進(jìn)程 (線程)監(jiān)聽每個客戶端的請求。創(chuàng)建好連接之后文件就可以通過流的形式傳輸。 linu_ 內(nèi)核中為我們提供了兩種不同形式的讀寫流,包括read、write和send、recv??蛻魴C(jī)對文件的查看指令也是通過流傳遞給服務(wù)器,服務(wù)器根據(jù)請求類型返回不同相應(yīng)流。根據(jù) socket原理和特點(diǎn)繪畫出鏈接流程圖,將客戶機(jī)與服務(wù)器的相互通信劃分為不同的模塊,每個模塊負(fù)責(zé)獨(dú)立的功能項(xiàng)。服務(wù)器輸入指令管理目錄下的文件, createfilename是創(chuàng)建文件命令,renameoldnamenewname是刪除文命令,deletefilename是刪除文件命令,同時監(jiān)聽著客戶端的請求;客戶端向服務(wù)器發(fā)送上傳、下載和查看請求,從而得到不同的相應(yīng),包括將文件下載到當(dāng)前路徑下,從當(dāng)前路徑下上傳文件給服務(wù)器,列出服務(wù)器的文件列表。二、通信原理Linu_是計(jì)算機(jī)使用的主流操作系統(tǒng)之一, TCP/IP是廣為應(yīng)用的互聯(lián)網(wǎng)協(xié)議, Linu_為TCP/IP網(wǎng)絡(luò)編程提供了一種網(wǎng)絡(luò)進(jìn)程通信機(jī)制 :套接字接口(SocketsInterface)。以下將介紹Linu_環(huán)境下套接字的基本概念及編程技術(shù),并結(jié)合實(shí)例說明在 Linu_下如何用套接字實(shí)現(xiàn)客戶機(jī)/服務(wù)器方式的進(jìn)程通信。(一)TCP/IPTCP/IP即傳輸控制協(xié)議個由多種協(xié)議組成的協(xié)議族,規(guī)范。
/網(wǎng)際協(xié)議(TransmissionControlProtocol/InterProtocol),是一他定義了計(jì)算機(jī)通過網(wǎng)絡(luò)互相通信及協(xié)議族各層次之間通信的TCP是一種面向連接的、可靠的、雙向的通信數(shù)據(jù)流,說他可靠,是因?yàn)樗褂?3段握手協(xié)議傳輸數(shù)據(jù), 并且在傳輸時采用"重傳肯定確認(rèn)" 機(jī)制保證數(shù)據(jù)的正確發(fā)送:接收端收到數(shù)據(jù)后要發(fā)出一個肯定確認(rèn), 而發(fā)送端必須要能接收到這個肯定信號, 否則就要將數(shù)據(jù)重發(fā)。在此原理基礎(chǔ)之上, 設(shè)計(jì)了基于 Linu_操作系統(tǒng)下 TCP/IP編程實(shí)現(xiàn)文件傳輸?shù)膶?shí)例。我們采用客戶機(jī) /務(wù)器模式通信時,通信雙方發(fā)送 /接收數(shù)據(jù)的工作Linu_支持BSD的套接字和全部的 TCP/IP協(xié)議,是通過網(wǎng)絡(luò)協(xié)議將其視為一組相連的軟件層來實(shí)現(xiàn)的。 BSD套接字(BSDSocket)由通用的套接字管理軟件支持,該軟件是 I套接字層,用來管理基于 IP的TCP與UDP端口到端口的互聯(lián)問題。從協(xié)議分層來看, IP是網(wǎng)絡(luò)層協(xié)議, TCP是一個可靠的端口到端口的傳輸層協(xié)議,他是利用 IP層進(jìn)行傳接報(bào)文的;同時也是面向連接的, 通過建立一條虛擬電路在不同的網(wǎng)絡(luò)問傳輸報(bào)文, 保證所傳輸報(bào)文的無丟失性和無重復(fù)性。用戶數(shù)據(jù)報(bào)文協(xié)議 (UserDatagramProtocol,UDP)也是利用 IP層第3頁共21頁Linu_環(huán)境下基于 TCP/IP及Socket技術(shù)的遠(yuǎn)程文件傳送控制編程報(bào)告?zhèn)鬏攬?bào)文,但他是一個非面向連接的傳輸層協(xié)議。利用 IP層傳輸報(bào)文時,當(dāng)目的方網(wǎng)際協(xié)議層收到 IP報(bào)文后,必須能夠識別出該報(bào)文所使用的上層協(xié)議 (即傳輸層協(xié)議 )。因此,在IP報(bào)頭中,設(shè)有一個"協(xié)議"域 (Protoco1)。通過該域的值,即可判明其上層協(xié)議類型。傳輸層與網(wǎng)絡(luò)層在功能上的最大區(qū)別是前者提供進(jìn)程通信能力,而后者則不能。在進(jìn)程通信的意義上,網(wǎng)絡(luò)通信的最終地址不僅僅是主機(jī)地址,還包括可以描述進(jìn)程的某種標(biāo)識符。為此,TCP/UDP提出了協(xié)議端口 (ProtocolPort)的概念,用于標(biāo)識通信的進(jìn)程。例如, Web服務(wù)器進(jìn)程通常使用端口 80,在/etc/serv~ices文件中有這些注冊了的端口地址。對于TCP傳輸,傳輸節(jié)點(diǎn)問先要建立連接,然后通過該連接傳輸已排好序的報(bào)文,以保證傳輸?shù)恼_性。 IP層中的代碼用于實(shí)現(xiàn)網(wǎng)際協(xié)議, 這些代碼將 IP頭增加到傳輸數(shù)據(jù)中,同時也把收到的 IP報(bào)文正確地轉(zhuǎn)送到 TCP層或UDP層。TCP是一個面向連接協(xié)議,而UDP則是一個非面向連接協(xié)議,當(dāng)一個 UDP報(bào)文發(fā)送出去后, Linu_并不知道也不去關(guān)心他是否成功地到達(dá)了目的主機(jī)。IP層之下,是支持所有Linu_網(wǎng)絡(luò)應(yīng)用的網(wǎng)絡(luò)設(shè)備層,例如:點(diǎn)到點(diǎn)協(xié)議(PointtoPointProtocol,PPP)和以太網(wǎng)層。網(wǎng)絡(luò)設(shè)備并非總代表物理設(shè)備,其中有一些(例如回送設(shè)備 )則是純粹的軟件設(shè)備,網(wǎng)絡(luò)設(shè)備與標(biāo)準(zhǔn)的 Linu_設(shè)備不同,他們不是通過Mknod命令創(chuàng)建的,必須是底層軟件找到并進(jìn)行了初始化之后,這些設(shè)備才被創(chuàng)建并可用。因此只有當(dāng)啟動了正確設(shè)置的以太網(wǎng)設(shè)備驅(qū)動程序的內(nèi)核后,才會有 /dev/eth0文件。ARP協(xié)議位于 IP層和支持地址解析的協(xié)議層之間。(二)Socket1.套接字簡介套接字(Socket)是網(wǎng)絡(luò)通信的基本操作單元, 它提供了不同主機(jī)間進(jìn)程雙向通信的端點(diǎn),這些進(jìn)程在通信前各自建立一個 Socket,并通過對 Socket的讀/寫操作實(shí)現(xiàn)網(wǎng)絡(luò)通信功能。套接字分為以下 3種類型。字節(jié)流套接字這是最常用的套接字類型, TCP/IP協(xié)議簇中的 TCP(TransportControlProtocol)協(xié)議使用此類接口,它提供面向連接的(建立虛電路)、無差錯的、發(fā)送先后順序一致的、包長度不限和非重復(fù)的網(wǎng)絡(luò)信包傳輸。數(shù)據(jù)報(bào)套接字TCP/IP協(xié)議族中的 UDP(UserDatagramProtocol)協(xié)議使用此類接口,它是無連接的服務(wù),以獨(dú)立的信包進(jìn)行網(wǎng)絡(luò)傳輸,信包最大長度為32KB,傳輸不保證順序性、可靠性和無重復(fù)性,它通常用于單個報(bào)文傳輸或可靠性不重要的場合。原始數(shù)據(jù)報(bào)套接字提供對網(wǎng)絡(luò)下層通訊協(xié)議(如IP協(xié)議)的直接訪問,它一般不是提供給普通用戶的,主要用于開發(fā)新的協(xié)議或用于提取協(xié)議較隱蔽的功能。2.套接字編程方法這里將分別介紹面向連接協(xié)議的字節(jié)流套接字與非連接協(xié)議的數(shù)據(jù)報(bào)套接字的編程方法,因原始數(shù)據(jù)報(bào)套接字在實(shí)際工作中較少,在此不作討論。不論何種套接字編程均采用客戶機(jī)/服務(wù)器的協(xié)作模式,即由客戶進(jìn)程向服務(wù)器進(jìn)程發(fā)出請求,服務(wù)器進(jìn)程執(zhí)行被請求的任務(wù)并將結(jié)果返回給客戶進(jìn)程。字節(jié)流套接字的服務(wù)進(jìn)程和客戶進(jìn)程在通信前必須建立連接。建立連接及通信的步驟見圖 1。1)服務(wù)進(jìn)程首先調(diào)用 Socket創(chuàng)建一個字節(jié)流套接字,并調(diào)用 bind將服務(wù)器地址捆扎在該套接字上,接著調(diào)用listen監(jiān)聽連接請求,隨后調(diào)用accept做好與客戶進(jìn)程建立連接的準(zhǔn)備,無連接請求時,服務(wù)進(jìn)程被阻塞;第4頁共21頁Linu_環(huán)境下基于 TCP/IP及Socket技術(shù)的遠(yuǎn)程文件傳送控制編程報(bào)告2)客戶進(jìn)程調(diào)用 Socket創(chuàng)建字節(jié)流套接字,然后調(diào)用 connect向服務(wù)進(jìn)程發(fā)出連接請求;當(dāng)連接請求到來后,服務(wù)進(jìn)程被喚醒,生成一個新的字節(jié)流套接字,并用新套接字同客戶進(jìn)程的套接字建立連接,而服務(wù)進(jìn)程最早生成的套接字則繼續(xù)用于監(jiān)聽網(wǎng)絡(luò)上的服務(wù)請求;4)服務(wù)進(jìn)程和客戶進(jìn)程通過調(diào)用 read和write交換數(shù)據(jù);服務(wù)進(jìn)程和客戶進(jìn)程通過調(diào)用close撤消套接字并中斷連接。數(shù)據(jù)套接字的服務(wù)進(jìn)程客戶進(jìn)程通信前不必建立連接, 通信的步驟見圖 2。服務(wù)進(jìn)程首先調(diào)用Socket創(chuàng)建一個數(shù)據(jù)套接字,并調(diào)用Bind將服務(wù)器地址捆扎在該套接字上,然后調(diào)用Recvfrom等待客戶進(jìn)程發(fā)來的請求;客戶進(jìn)程在調(diào)用Socket創(chuàng)建一個數(shù)據(jù)報(bào)套接字后,調(diào)用Bind將客戶機(jī)地址捆扎在此套接字上,接著調(diào)用 Sendto向服務(wù)進(jìn)程發(fā)送請求,然后調(diào)用 Recvfrom等待服務(wù)進(jìn)程返回該請求的處理結(jié)果;3)服務(wù)進(jìn)程在執(zhí)行客戶進(jìn)程所請求的任務(wù)后,調(diào)用 Sendto將處理結(jié)果返回給客戶進(jìn)程;第5頁共21頁Linu_環(huán)境下基于 TCP/IP及Socket技術(shù)的遠(yuǎn)程文件傳送控制編程報(bào)告服務(wù)進(jìn)程和客戶進(jìn)程通過調(diào)用Close撤消套接字。3.套接字編程示例下面給出一個運(yùn)用字節(jié)流套接字在TCP/IP網(wǎng)絡(luò)上實(shí)現(xiàn)客戶機(jī)/服務(wù)器方式進(jìn)程通信的實(shí)例。在此例中,服務(wù)進(jìn)程先于客戶進(jìn)程運(yùn)行,當(dāng)雙方建立連接后,服務(wù)進(jìn)程通過該連接向客戶進(jìn)程不斷發(fā)送一個連續(xù)增長的序列數(shù),客戶進(jìn)程每接收到50個序列數(shù)就在屏幕上顯示一個‘.’,顯示至20個點(diǎn)后換行,直至任意一方進(jìn)程被中斷為止。includeincludeincludeincludeincludemain{intsock,namelen,seq,int;structsockaddr-inserver;//存服務(wù)器的inter地址charmsgsock;第6頁共21頁Linu_環(huán)境下基于 TCP/IP及Socket技術(shù)的遠(yuǎn)程文件傳送控制編程報(bào)告charbuf[1024];//創(chuàng)建inter域的TCP協(xié)議的字節(jié)流套接字sock=socket(AF-I,SOCK-STREAM,IPPROTO-TCP);if(sock#include //包含套接字函數(shù)庫第13頁共21頁Linu_環(huán)境下基于 TCP/IP及Socket技術(shù)的遠(yuǎn)程文件傳送控制編程報(bào)告#include#include //包含AF_I相關(guān)結(jié)構(gòu)#include //包含AF_I相關(guān)操作的函數(shù)#include#include#include#include#include#include#definePORT9999#defineBUFFSIZE1000#defineMA_PATH32#defineLENsizeof(structlist)intcount=0; //計(jì)量歌曲數(shù)doublefilesize; //文件總大小structlist{charpathname[1024];charfilename[512];structlist_ne_t;};structlist_head,_p1,_p2;voidscan_dir(char_dir,intdepth) //定義目錄掃描函數(shù){DIR_dp;structdirent_entry;structstatstatbuff;intl;if(!(dp=opendir(dir))){//puts("can#;topen");return;}chdir(dir); //切換到當(dāng)前目錄中去while((entry=readdir(dp))!=NULL){lstat(entry->d_name,statbuff);//獲取下一級成員屬性if(S_IFDIRstatbuff.st_mode) //判斷下一級成員是否是目錄{if(strcmp(".",entry->d_name)==0||strcmp(“..",entry->d_name)==0)continue;//printf("_ss/\n",depth,"",entry->d_name);第14頁共21頁Linu_環(huán)境下基于 TCP/IP及Socket技術(shù)的遠(yuǎn)程文件傳送控制編程報(bào)告scan_dir(entry->d_name,depth+4); //調(diào)用自身,掃描下一級}else{l=strlen(entry->d_name);l-=4;if(strcmp(entry->d_name+l,".")==0||strcmp(entry->d_name+l,“.")==0){charpath_buff[MA_PATH];getcwd(path_buff,MA_PATH);p1=malloc(LEN);strcpy(p1->pathname,path_buff);strcpy(p1->filename,entry->d_name);//printf("shellos",p1->pathname,p1->filename);p1->ne_t=0;count++;if(count==1)head=p2=p1;else{p2->ne_t=p1;//p2=p2->ne_t;p2=p1;//printf("hello");}inttem;tem=statbuff.st_size;filesize+=tem;}}}chdir(".."); //回到上一級目錄closedir(dp);}intprint{structlist_temp;temp=head;//printf("here1");if(head!=NULL)do{printf("ss\n",temp->pathname,temp->filename);temp=temp->ne_t;}while(temp!=NULL);第15頁共21頁Linu_環(huán)境下基于 TCP/IP及Socket技術(shù)的遠(yuǎn)程文件傳送控制編程報(bào)告return;}intmain{puts("Scandisk");scan_dir("/home",0);printf(“Listoutput:\n");print;puts("Scanend\n");printf("TotaldFiles\n",count);printf(“Total3.2gMB\n",filesize/1024/1024);intserver_sockfd,client_sockfd;intserver_len,client_len;structsockaddr_inserver_sockaddr,client_sockaddr;server_sockfd=socket(AF_I,SOCK_STREAM,0);// 定義套接字類型server_sockaddr.sin_family=AF_I;server_sockaddr.sin_port=htons(PORT);server_sockaddr.sin_addr.s_addr=INADDR_ANY;server_len=sizeof(server_sockaddr);//允許重復(fù)使用本地地址和套接字綁定intj=1;setsockopt(server_sockfd,SOL_SOCKET,SO_REUSEADDR,j,sizeof(j));//綁定端口if(bind(server_sockfd,(structsockaddr_)server_sockaddr,server_len)==-1){perror("bind:");e_it(1);}//監(jiān)聽端口if(listen(server_sockfd,5)==-1){perror("listen:");e_it(1);}printf("Listening\n");pid_tpid;client_len=sizeof(client_sockaddr);while(1){if((client_sockfd=accept(server_sockfd,(structsockaddr_)client_sockaddr,client_len))==-1){perror("accepterror:");第16頁共21頁Linu_環(huán)境下基于 TCP/IP及Socket技術(shù)的遠(yuǎn)程文件傳送控制編程報(bào)告e_it(1);}printf("sConnecttotheserver\n",i_ntoa(client_sockaddr.sin_addr));printf("Readytosendafile\n");pid=fork; //創(chuàng)建子進(jìn)程if(pid==0) //子進(jìn)程發(fā)送數(shù)據(jù){//發(fā)送文件數(shù)目intcountbyte;countbyte=send(client_sockfd,count,4,0);//printf("countbyte=d\n",countbyte);charfileinfo[100]; //定義文件信息,包括文件路徑和文件名memset(fileinfo,0,100);charfilename[50];memset(filename,0,50);structstatstatbuff;structlist_temp;temp=head;if(head!=NULL)do{printf("ss\n",temp->pathname,temp->filename);charc[2]={#;/#;};strcat(temp->pathname,c);strcat(temp->pathname,temp->filename);printf("temp->pathname=s\n",temp->pathname);strcpy(fileinfo,temp->pathname);strcpy(filename,temp->filename);printf("fileinfo=s\n",fileinfo);printf(“filename=s\n",filename);intsendbytes=0;sendbytes=send(client_sockfd,filename,50,0);printf("sendbytes=d\n",sendbytes);//發(fā)送文件大小intfilesize=0;intsendfsize;lstat(fileinfo,statbuff);filesize=statbuff.st_size;printf("filesize=d\n",filesize);sendfsize=send(client_sockfd,filesize,4,0);printf("sendfsize=d\n",sendfsize);charbuff[BUFFSIZE];memset(buff,0,BUFFSIZE);FILE_fp=fopen(fileinfo,"r");if(NULL==fp)第17頁共21頁Linu_環(huán)境下基于 TCP/IP及Socket技術(shù)的遠(yuǎn)程文件傳送控制編程報(bào)告{printf("File:NotFound\n");}else{intfile_block_length=0;while((file_block_length=fread(buff,sizeof(char),BUFFSIZE,fp))>0){printf("file_block_length=d\n",file_block_length);if(send(client_sockfd,buff,file_block_length,0)ne_t;}while(temp!=NULL);printf("FilessentOver\n");}//endofchildprocessif(pid>0){close(client_sockfd);}}//endofwhile(1)}(二)客戶端#include#include#include#include#include#include#include#include#include#include#defineIP_ADDR"127.0.0.1"intmain{第18頁共21頁Linu_環(huán)境下基于 TCP/IP及Socket技術(shù)的遠(yuǎn)程文件傳送控制編程報(bào)告unsignedcharfilename[50];intfilesize;unsignedchardatabuf[1000];intsockfd;structsockaddr_inserv_addr;structhostent_host;inti;intlastsize=0;host=gethostbyname("localhost");sockfd=socket(AF_I,SOCK_STREAM,0);serv_addr.sin_family=AF_I;serv_addr.sin_port=htons(9999);//serv_addr.sin_addr=_((structin_addr_)host->h_addr);serv_addr.sin_addr.s_addr=i_addr(IP_ADDR);bzero((serv_addr.sin_zero),8);if(connect(sockfd,(structsockaddr_)serv_addr,sizeof(structsockaddr))==-1){perror(“connect");e_it(1);}//接收文件數(shù)目intcount=0;intcountbyte;countbyte=recv(sockfd,count,4,0);printf("Filenumber=i\n",count);while(count--){i=recv(sockfd,filename,sizeof(filename),0); //接收文件名printf("recvdbytes\n",i);printf(“filename=s\n",filename);i=recv(sockfd,filesize,sizeof(filesize),0); //接收文件大小printf("recvdbytes\n",i);printf("filesize=d\n",filesize);lastsize=filesize; //文件大小賦給變量接收文件內(nèi)容FILE_fp=fopen(filename,"w");if(NULL==fp){printf("File:CanNotOpenToWrite\n");e_it(1);}i=0;while(lastsize>0){第19頁共21頁Linu_環(huán)境下基于 TCP/IP及Socket技術(shù)的遠(yuǎn)程文件傳送控制編程報(bào)告printf("lastsize=d\n",lastsize);if(lastsize>sizeof(databuf)){i=recv(sockfd,databuf,sizeof(databuf),0);printf("Bytesreceivedi=d\n",i);intwrite_length=fwrite(databuf,sizeof(char),i,fp);if(write_length<i){printf("File:WriteFailed\n");brea
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 教職工思想培訓(xùn)
- 2025年延川縣幼兒園教師招教考試備考題庫及答案解析(奪冠)
- 卡壓式涂覆碳鋼管施工方案
- 光伏發(fā)電項(xiàng)目專項(xiàng)施工方案模板
- 2025年景縣招教考試備考題庫附答案解析(必刷)
- 2025年江西交通職業(yè)技術(shù)學(xué)院馬克思主義基本原理概論期末考試模擬題及答案解析(必刷)
- 2025年沁源縣招教考試備考題庫含答案解析(必刷)
- 2025年靖安縣招教考試備考題庫及答案解析(必刷)
- 2025年山陰縣幼兒園教師招教考試備考題庫及答案解析(必刷)
- 2025年柞水縣幼兒園教師招教考試備考題庫附答案解析(必刷)
- 長護(hù)險(xiǎn)人員管理培訓(xùn)制度
- 2026河南大學(xué)附屬中學(xué)招聘77人備考題庫附答案
- 網(wǎng)絡(luò)安全運(yùn)維與管理規(guī)范(標(biāo)準(zhǔn)版)
- 名創(chuàng)優(yōu)品招聘在線測評題庫
- 液冷系統(tǒng)防漏液和漏液檢測設(shè)計(jì)研究報(bào)告
- (2025版)中國焦慮障礙防治指南
- 春節(jié)交通出行安全培訓(xùn)課件
- 妊娠期缺鐵性貧血中西醫(yī)結(jié)合診療指南-公示稿
- 金蝶合作協(xié)議書
- 2025年工廠三級安全教育考試卷含答案
- 2026年上海理工大學(xué)單招職業(yè)適應(yīng)性測試題庫附答案
評論
0/150
提交評論