《在Linux下基于TCP協(xié)議的文件傳輸程序匯總》由會員分享,可在線閱讀,更多相關(guān)《在Linux下基于TCP協(xié)議的文件傳輸程序匯總(12頁珍藏版)》請在裝配圖網(wǎng)上搜索。
Linux下基于TCP/IP協(xié)議的文件傳輸程序
【設(shè)計目的】
通過Linux C編程,設(shè)計一個基于TCP/IP的文件傳輸系統(tǒng),實(shí)現(xiàn)網(wǎng)絡(luò)文件的收發(fā)
【設(shè)計環(huán)境】
Ubuntu 12.04
【設(shè)計方案】
(1) 文件讀寫
任意文件都可以二進(jìn)制的方式進(jìn)行讀寫,為了實(shí)現(xiàn)任意文件類型的傳輸,在讀寫文件的過程中,必須采用二進(jìn)制的讀寫方式。
(2) 傳輸協(xié)議
為了保證數(shù)據(jù)的正確性,文件傳輸需要采用一種可靠的傳輸協(xié)議。UDP協(xié)議實(shí)現(xiàn)比較簡單,但UDP面向無連接,傳輸過程中,會出現(xiàn)丟包的情況,導(dǎo)致數(shù)據(jù)發(fā)送失敗。故采用面向連接的TCP/IP協(xié)議,防止傳輸過程中的數(shù)據(jù)丟失的情況。
(3) 大文件的傳輸
對于比較大的文件,應(yīng)該進(jìn)行分包操作,以防止占用過多的內(nèi)存,導(dǎo)致文件發(fā)送失敗。
【設(shè)計流程】
如圖1所示,服務(wù)器程序作為文件的發(fā)送方。首先,服務(wù)器端輸入要發(fā)送的文件。然后,創(chuàng)建一個流式套接字(SOCK_STREAM),進(jìn)行綁定。綁定成功后,執(zhí)行監(jiān)聽,當(dāng)有客戶發(fā)送連接請求,執(zhí)行Accept(),接收來自客戶端的請求。
連接建立后,首先服務(wù)器向客服端發(fā)送的文件的文件名及擴(kuò)展名等信息。信息發(fā)送完畢,服務(wù)器方將待發(fā)送的數(shù)據(jù)讀入緩沖區(qū),通過套接字將數(shù)據(jù)發(fā)送出去。發(fā)送完成后退出,并顯示發(fā)送完成的信息。
圖1 服務(wù)器流程圖
如圖2所示,客戶端程序完成文件的接收操作。首先,創(chuàng)建一個流式套接字。套接字創(chuàng)建成功后,對該套接字進(jìn)行綁定。綁定成功后,向服務(wù)器方發(fā)送連接請求。連接成功后,首先,接收服務(wù)器發(fā)送的文件信息。接收成功后,開始數(shù)據(jù)的接收。文件接收完畢,顯示文件已接收完成。
圖2 客戶端流程圖
【設(shè)計測試】
了驗(yàn)證設(shè)計的正確性,在Ubuntu 12.04系統(tǒng)上對可執(zhí)行文件進(jìn)行了回環(huán)測試。
步驟如下:
(1)測試文件a.txt及服務(wù)器端文件源fileserver.c和可執(zhí)行文件fileserver
(2)客戶端源文件及可執(zhí)行文件
(3)執(zhí)行服務(wù)器端文件fileserver并輸入要傳輸?shù)奈募.txt,等待客戶端連接
(4)執(zhí)行客戶端文件fileclient,如果不輸入IP地址將顯示提示
(5)執(zhí)行客戶端文件后,輸入完整命令,文件傳輸文件完成
(6)看到服務(wù)器端也顯示文件傳輸完成
服務(wù)器源碼:
#include
#include
#include
#include
#include
#include
#include
#include
#define PORT 6000
#define LISTENQ 20
#define BUFFSIZE 4096
#define FILE_NAME_MAX_SIZE 512
int main(int argc, char **argv[])
{
//輸入文件名稱
char filename[FILE_NAME_MAX_SIZE];
bzero(filename,FILE_NAME_MAX_SIZE);
printf("Please input the file name you wana to send:");
scanf("%s",&filename);
getchar();
//設(shè)置一個socket地址結(jié)構(gòu)
int sockfd,connfd;
struct sockaddr_in svraddr,clientaddr;
bzero(&svraddr,sizeof(svraddr));//把一段內(nèi)存區(qū)的內(nèi)容全部設(shè)置為0
svraddr.sin_family=AF_INET;
svraddr.sin_addr.s_addr=htonl(INADDR_ANY);
svraddr.sin_port=htons(PORT);
//創(chuàng)建用于internet的流協(xié)議(TCP)socket
sockfd=socket(AF_INET,SOCK_STREAM,0);
if(sockfd<0)
{
perror("socket");
exit(1);
}
//把socket和socket地址結(jié)構(gòu)綁定
if(bind(sockfd,(struct sockaddr*)&svraddr,sizeof(svraddr))<0)
{
perror("bind");
exit(1);
}
//監(jiān)聽
if(listen(sockfd,LISTENQ)<0)
{
perror("listen");
exit(1);
}
while(1)//服務(wù)器端一直運(yùn)行
{
socklen_t length=sizeof(clientaddr);
//等待請求
connfd=accept(sockfd,(struct sockaddr*)&clientaddr,&length);
if(connfd<0)
{
perror("connect");
exit(1);
}
//發(fā)送文件信息
char buff[BUFFSIZE];
int count;
bzero(buff,BUFFSIZE);
strncpy(buff,filename,strlen(filename)>FILE_NAME_MAX_SIZE?FILE_NAME_MAX_SIZE:strlen(filename));
count=send(connfd,buff,BUFFSIZE,0);
if(count<0)
{
perror("Send file imformation");
exit(1);
}
//讀取文件并發(fā)送文件
FILE *fd=fopen(filename,"rb");
if(fd==NULL)
{
printf("File :%s not found!\n",filename);
}
else
{
bzero(buff,BUFFSIZE);
int file_block_length=0;
while((file_block_length=fread(buff,sizeof(char),BUFFSIZE,fd))>0)
{
printf("file_block_length:%d\n",file_block_length);
if(send(connfd,buff,file_block_length,0)<0)
{
perror("Send");
exit(1);
}
bzero(buff,BUFFSIZE);
}
fclose(fd);
printf("Transfer file finished !\n");
}
close(connfd);
}
close(sockfd);//關(guān)閉socket
return 0;
}
客戶端源碼:
#include
#include
#include
#include
#include
#include
#include
#include
#define PORT 6000
#define LISTENQ 20
#define BUFFSIZE 4096
#define FILE_NAME_MAX_SIZE 512
int main(int argc, char **argv[])
{
int clientfd;
if(argc!=2)//判斷參數(shù)是否完整
{
fprintf(stderr,"Usage:./fileclient \n");
exit(1);
}
struct sockaddr_in clientaddr;
bzero(&clientaddr,sizeof(clientaddr));
clientaddr.sin_family=AF_INET;
clientaddr.sin_addr.s_addr=htons(INADDR_ANY);//INADDR_ANY表示自動獲取本機(jī)地址
clientaddr.sin_port=htons(0); //0表示讓系統(tǒng)自動分配一個空閑端口
//創(chuàng)建用于internet的流協(xié)議(TCP)socket,用clientfd代表客戶機(jī)socket
clientfd=socket(AF_INET,SOCK_STREAM,0);
if(clientfd<0)
{
perror("socket");
exit(1);
}
//把客戶機(jī)的socket和客戶機(jī)的socket地址結(jié)構(gòu)聯(lián)系起來
if(bind(clientfd,(struct sockaddr*)&clientaddr,sizeof(clientaddr))<0)
{
perror("bind");
exit(1);
}
//設(shè)置一個socket地址結(jié)構(gòu)體
struct sockaddr_in svraddr;
bzero(&svraddr,sizeof(svraddr));
if(inet_aton(argv[1],&svraddr.sin_addr)==0)//IP地址來自程序的參數(shù)
{
perror("inet_aton");
exit(1);
}
svraddr.sin_family=AF_INET;
svraddr.sin_port=htons(PORT);
socklen_t svraddrlen=sizeof(svraddr);
//向服務(wù)器發(fā)起連接,連接成功后client_socket代表了客戶機(jī)和服務(wù)器的一個socket連接
if(connect(clientfd,(struct sockaddr*)&svraddr,svraddrlen)<0)
{
perror("connect");
exit(1);
}
//接收文件信息
char buff[BUFFSIZE];
char filename[FILE_NAME_MAX_SIZE];
bzero(filename, FILE_NAME_MAX_SIZE);
int count;
bzero(buff,BUFFSIZE);
count=recv(clientfd,buff,BUFFSIZE,0);
if(count<0)
{
perror("recv");
exit(1);
}
strncpy(filename,buff,strlen(buff)>FILE_NAME_MAX_SIZE?FILE_NAME_MAX_SIZE:strlen(buff));
printf("Preparing recv file : %s---from---%s \n",filename,argv[1]);
//接收文件
FILE *fd=fopen(filename,"wb+");
if(NULL==fd)
{
perror("open");
exit(1);
}
bzero(buff,BUFFSIZE);
int length=0;
while(length=recv(clientfd,buff,BUFFSIZE,0))
{
if(length<0)
{
perror("recv");
exit(1);
}
int writelen=fwrite(buff,sizeof(char),length,fd);
if(writelen
下載提示(請認(rèn)真閱讀)
- 1.請仔細(xì)閱讀文檔,確保文檔完整性,對于不預(yù)覽、不比對內(nèi)容而直接下載帶來的問題本站不予受理。
- 2.下載的文檔,不會出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預(yù)覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請點(diǎn)此認(rèn)領(lǐng)!既往收益都?xì)w您。
文檔包含非法信息?點(diǎn)此舉報后獲取現(xiàn)金獎勵!
下載文檔到電腦,查找使用更方便
15
積分
- 配套講稿:
如PPT文件的首頁顯示word圖標(biāo),表示該P(yáng)PT已包含配套word講稿。雙擊word圖標(biāo)可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國旗、國徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計者僅對作品中獨(dú)創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
-
Linux
基于
TCP
協(xié)議
文件傳輸
程序
匯總
- 溫馨提示:
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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
裝配圖網(wǎng)所有資源均是用戶自行上傳分享,僅供網(wǎng)友學(xué)習(xí)交流,未經(jīng)上傳用戶書面授權(quán),請勿作他用。
鏈接地址:http://www.820124.com/p-11095489.html