當前位置:首頁 » 文件管理 » ftp客戶端c源碼

ftp客戶端c源碼

發布時間: 2023-06-02 00:08:04

linux下用C語言寫一個ftp系統程序,包含server和client兩部分

我覺得你可能沒講清楚吧,是寫一個類似FTP功能的程序(包括server和client)?還是要實現一個FTP的server和client?前者很簡單,先網路linux socket編程,再網路linux下文件讀寫,之後無非就是調通server和client的tcp連接之後,把讀出來的東西發過去就是了。後者要實現完整的ftp協議,如果你只是本科的話,我覺得這個確實夠難的,但這也是有開源代碼的,http://sourceforge.net/projects/libftp/,反正是大作業,慢慢看吧。不過我感覺你的需求多半是前者,否則你們老師也太BT了,這年頭誰還會自己開發ftp協議啊。。。

㈡ 一個FTP客戶端的C語言程序中的一個函數不懂

前四個位元組是這樣,比如「220 ProFTPD 1.3.2c Server (Debian) [10.10.55.203]」
前四個位元組就是220空格,這個代表了服務主機的返回碼
atoi那個把字元串轉成整型,n就=220了

㈢ 怎麼編寫基於C語言的FTP客戶端

敘述起來很繁瑣。你可以到網上下一個C語言的FTP客戶端程序閱讀和試驗,就懂了。
就搜索 ftpclient.c 很容易獲得 源程序,程序里有註解和說明。10幾20幾年的經典程序啦。

㈣ 求FTP Server和FTP Client的源代碼,要java或C++的,

客戶端
/* Client side of an ftp service. Actions:
- connect to server and request service
- send size-of-sile info to server
- start receiving file from server
- close connection
*/

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <time.h>
#include <errno.h>

#define SERVER_PORT_ID 6081
#define CLIENT_PORT_ID 6086
#define SERVER_HOST_ADDR "128.119.40.186"
/* gaia.cs.umass.e */
#define MAXSIZE 512

#define ACK 2
#define NACK 3
#define REQUESTFILE 100
#define COMMANDNOTSUPPORTED 150
#define COMMANDSUPPORTED 160
#define BADFILENAME 200
#define FILENAMEOK 400
#define STARTTRANSFER 500
int readn(int sd,char *ptr,int size);
int writen(int sd,char *ptr,int size);

main(int argc,char *argv[])

{

int sockid, newsockid,i,getfile,ack,msg,msg_2,c,len;
int no_writen,start_xfer, num_blks,num_last_blk;
struct sockaddr_in my_addr, server_addr;
FILE *fp;
char in_buf[MAXSIZE];
if(argc != 2) {printf("error: usage : sftp filename\n"); exit(0);}
no_writen = 0;
num_blks = 0;
num_last_blk = 0;
len = strlen(argv[1]);
printf("client: creating socket\n");
if ((sockid = socket(AF_INET,SOCK_STREAM,0)) < 0)
{ printf("client: socket error : %d\n", errno); exit(0);
}

printf("client: binding my local socket\n");
bzero((char *) &my_addr,sizeof(my_addr));
my_addr.sin_family = AF_INET;
my_addr.sin_addr.s_addr = htonl(INADDR_ANY);
my_addr.sin_port = htons(CLIENT_PORT_ID);
if (bind(sockid ,(struct sockaddr *) &my_addr,sizeof(my_addr)) < 0)
{printf("client: bind error :%d\n", errno); exit(0);
}

printf("client: starting connect\n");
bzero((char *) &server_addr,sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = inet_addr(SERVER_HOST_ADDR);
server_addr.sin_port = htons(SERVER_PORT_ID);
if (connect(sockid ,(struct sockaddr *) &server_addr,
sizeof(server_addr)) < 0)
{printf("client: connect error :%d\n", errno); exit(0);
}

/* Once we are here, we've got a connection to the server */
/* tell server that we want to get a file */
getfile = htons(REQUESTFILE);
printf("client: sending command request to ftp server\n");
if((writen(sockid,(char *)&getfile,sizeof(getfile))) < 0)
{printf("client: write error :%d\n", errno); exit(0);}

/* want for go-ahead from server */
msg = 0;
if((readn(sockid,(char *)&msg,sizeof(msg)))< 0)
{printf("client: read error :%d\n", errno); exit(0); }
msg = ntohs(msg);
if (msg==COMMANDNOTSUPPORTED) {
printf("client: server refused command. goodbye\n");
exit(0);
}
else
printf("client: server replied %d, command supported\n",msg);

/* send file name to server */
printf("client: sending filename\n");
if ((writen(sockid,argv[1],len))< 0)
{printf("client: write error :%d\n", errno); exit(0);}
/* see if server replied that file name is OK */
msg_2 = 0;
if ((readn(sockid,(char *)&msg_2,sizeof(msg_2)))< 0)
{printf("client: read error :%d\n", errno); exit(0); }
msg_2 = ntohs(msg_2);
if (msg_2 == BADFILENAME) {
printf("client: server reported bad file name. goodbye.\n");
exit(0);
}
else
printf("client: server replied %d, filename OK\n",msg_2);

/* CLIENT KNOWS SERVER HAS BEEN ABLE TO OPEN THE FILE IN READ
MODE AND IS ASKING FOR GO-AHEAD*/
/* CLIENT NOW OPENS A COPY OF THE FILE IN WRITE MODE AND SENDS
THE GOAHEAD TO SERVER*/
printf("client: sending start transfer command\n");
start_xfer = STARTTRANSFER;
start_xfer = htons(start_xfer);
if ((writen(sockid,(char *)&start_xfer,sizeof(start_xfer)))< 0)
{printf("client: write error :%d\n", errno); exit(0);
}
if ((fp = fopen(argv[1],"w")) == NULL)
{printf(" client: local open file error \n");exit(0);}

/*NOW THE CLIENT IS READING INFORMATION FROM THE SERVER REGARDING HOW MANY
FULL BLOCKS OF SIZE MAXSIZE IT CAN EXPECT. IT ALSO RECEIVES THE NUMBER
OF BYTES REMAINING IN THE LAST PARTIALLY FILLED BLOCK, IF ANY */

if((readn(sockid,(char *)&num_blks,sizeof(num_blks))) < 0)
{printf("client: read error on nblocks :%d\n",errno);exit(0);}
num_blks = ntohs(num_blks);
printf("client: server responded: %d blocks in file\n",num_blks);
ack = ACK;
ack = htons(ack);
if((writen(sockid,(char *)&ack,sizeof(ack))) < 0)
{printf("client: ack write error :%d\n",errno);exit(0);
}

if((readn(sockid,(char *)&num_last_blk,sizeof(num_last_blk))) < 0)
{printf("client: read error :%d on nbytes\n",errno);exit(0);}
num_last_blk = ntohs(num_last_blk);
printf("client: server responded: %d bytes last blk\n",num_last_blk);
if((writen(sockid,(char *)&ack,sizeof(ack))) < 0)
{printf("client: ack write error :%d\n",errno);exit(0);
}

/* BEGIN READING BLOCKS BEING SENT BY SERVER */
printf("client: starting to get file contents\n");
for(i= 0; i < num_blks; i ++) {
if((readn(sockid,in_buf,MAXSIZE)) < 0)
{printf("client: block error read: %d\n",errno);exit(0);}
no_writen = fwrite(in_buf,sizeof(char),MAXSIZE,fp);
if (no_writen == 0) {printf("client: file write error\n");exit(0);}
if (no_writen != MAXSIZE)
{printf("client: file write error : no_writen is less\n");exit(0);}
/* send an ACK for this block */
if((writen(sockid,(char *)&ack,sizeof(ack))) < 0)
{printf("client: ack write error :%d\n",errno);exit(0);}
printf(" %d...",i);
}

/*IF THERE IS A LAST PARTIALLY FILLED BLOCK, READ IT */

if (num_last_blk > 0) {
printf("%d\n",num_blks);
if((readn(sockid,in_buf,num_last_blk)) < 0)
{printf("client: last block error read :%d\n",errno);exit(0);}
no_writen = fwrite(in_buf,sizeof(char),num_last_blk,fp);
if (no_writen == 0)
{printf("client: last block file write err :%d\n",errno);exit(0);}
if (no_writen != num_last_blk)
{printf("client: file write error : no_writen is less 2\n");exit(0);}
if((writen(sockid,(char *)&ack,sizeof(ack))) < 0)
{printf("client :ack write error :%d\n",errno);exit(0);}
}
else printf("\n");

/*FILE TRANSFER ENDS. CLIENT TERMINATES AFTER CLOSING ALL ITS FILES
AND SOCKETS*/
fclose(fp);
printf("client: FILE TRANSFER COMPLETE\n");
close(sockid);
}

/* DUE TO THE FACT THAT BUFFER LIMITS IN KERNEL FOR THE SOCKET MAY BE
REACHED, IT IS POSSIBLE THAT READ AND WRITE MAY RETURN A POSITIVE VALUE
LESS THAN THE NUMBER REQUESTED. HENCE WE CALL THE TWO PROCEDURES
BELOW TO TAKE CARE OF SUCH EXIGENCIES */

int readn(int sd,char *ptr,int size)

{ int no_left,no_read;
no_left = size;
while (no_left > 0)
{ no_read = read(sd,ptr,no_left);
if(no_read <0) return(no_read);
if (no_read == 0) break;
no_left -= no_read;
ptr += no_read;
}
return(size - no_left);
}

int writen(int sd,char *ptr,int size)
{ int no_left,no_written;
no_left = size;
while (no_left > 0)
{ no_written = write(sd,ptr,no_left);
if(no_written <=0) return(no_written);
no_left -= no_written;
ptr += no_written;
}
return(size - no_left);
}

服務端

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <time.h>
#include <errno.h>

#define MY_PORT_ID 6081
#define MAXLINE 256
#define MAXSIZE 512

#define ACK 2
#define NACK 3
#define REQUESTFILE 100
#define COMMANDNOTSUPPORTED 150
#define COMMANDSUPPORTED 160
#define BADFILENAME 200
#define FILENAMEOK 400

int writen(int sd,char *ptr,int size);
int readn(int sd,char *ptr,int size);

main() {

int sockid, newsd, pid, clilen;
struct sockaddr_in my_addr, client_addr;

printf("server: creating socket\n");
if ((sockid = socket(AF_INET,SOCK_STREAM,0)) < 0)
{printf("server: socket error : %d\n", errno); exit(0); }

printf("server: binding my local socket\n");
bzero((char *) &my_addr,sizeof(my_addr));
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(MY_PORT_ID);
my_addr.sin_addr.s_addr = htons(INADDR_ANY);
if (bind(sockid ,(struct sockaddr *) &my_addr,sizeof(my_addr)) < 0)
{printf("server: bind error :%d\n", errno); exit(0); }
printf("server: starting listen \n");
if (listen(sockid,5) < 0)
{ printf("server: listen error :%d\n",errno);exit(0);}

while(1==1) {
/* ACCEPT A CONNECTION AND THEN CREATE A CHILD TO DO THE WORK */
/* LOOP BACK AND WAIT FOR ANOTHER CONNECTION */
printf("server: starting accept\n");
if ((newsd = accept(sockid ,(struct sockaddr *) &client_addr,
&clilen)) < 0)
{printf("server: accept error :%d\n", errno); exit(0); }
printf("server: return from accept, socket for this ftp: %d\n",
newsd);
if ( (pid=fork()) == 0) {
/* CHILD PROC STARTS HERE. IT WILL DO ACTUAL FILE TRANSFER */
close(sockid); /* child shouldn't do an accept */
doftp(newsd);
close (newsd);
exit(0); /* child all done with work */
}
/* PARENT CONTINUES BELOW HERE */
close(newsd); /* parent all done with client, only child */
} /* will communicate with that client from now on */
}

㈤ ftp源碼怎麼搞定用c寫的,或者c++寫的,求啊急啊

nfs歸linux內核管
ftp的話,裝pureftp吧,比較小,貌似

㈥ Linux下用C語言寫一個FTP系統程序,基於客戶/伺服器模式

在絕大多數的LINUX發行版本中都選用的是WashingtonUniversity
FTP,它是一個著名的FTP伺服器軟體,一般簡稱為wu-ftp。它功能強大,能夠很好地運行於眾多的UNIX操作系統,例如:IBM
AIX、FreeBSD、HP-UX、NeXTstep、Dynix、SunOS、Solaris等。所以Internet上的FTP伺服器,一大半以上採用了它。wu-ftp擁有許多強大的功能,很適於吞吐量較大的FTP伺服器的管理要求:

1) 可以在用戶下載文件的同時對文件做自動的壓縮解壓縮操作;

2)
可以對不同網路上的機器做不同的存取限制;

3) 可以記錄文件上載和下載時間;

4)
可以顯示傳輸時的相關信息,方便用戶及時了解目前的傳輸動態;

5) 可以設置最大連接數,提高了效率,有效地控制了負載。

& 2.2 所需資源

&1.2.1
所需包

RedHat6.2 伺服器安裝

&1.2.2
所需配置文件

/etc/ftpusers
/etc/ftpaccess

/var/run/ftp.pids
/etc/ftpconversions

/var/log/xferlog
/etc/ftpgroups
/etc/ftphosts

&1.2.3 相關命令

ftpd FTP伺服器程序

ftpshut 用於關閉FTP伺服器程序
ftpcount 顯示目前在線人數
ftpwho
查看目前FTP伺服器的連接情況
ckconfig 檢查FTP伺服器的設置是否正確
ftprestart
重新啟動FTP服務

&1.2.4 相關目錄

/home/ftpd/bin
存放一些供FTP用戶使用的可執行文件
/home/ftpd/etc
存放一些供FTP用戶使用的配置文件
/home/ftpd/pub 存放供下載的信息

/home/ftpd/incoming 存放供上載信息的空間
配置方案

1.
/etc/ftpaccess

說明: ftp許可權配置文件
源文件:

guestuser weboa
# FTP用戶
class all real,guest,anonymous
*
class weboa guest *
# 格式:class [類名]
[real/guest/anonymous]
[IP地址]

功能:
這個指令的功能設定FTP伺服器上用戶的類別。並可對客戶端的IP地址進行限制,允許某部分的IP地址或全部的IP地址訪問。而在FTP
伺服器上的用戶基本上可以分為以下三類:

real 在該FTP伺服器有合法帳號的用戶;
guest 有記錄的匿名用戶;

anonymous 許可權最低的匿名用戶
email [email protected]

loginfails 5
# 格式:loginfails [次數]

功能:設定當用戶登錄到FTP伺服器時,允許用戶輸錯密碼的次數。
readme README* login

readme README* cwd=*
message /welcome.msg
login
message .message cwd=*
#
格式:message [文件名稱] [指令]
功能:當用戶執行所指定的指令時,系統將指定的文件內容顯示出來。

compress yes all
# 格式:compress
[yes/no] [類別]
功能:設置哪一個類別的用戶可以使用compress(壓縮)功能。
tar
yes all
# 格式:tar [yes/no] [類別]

功能:設置哪一個類別的用戶可以使用tar(歸檔)功能。
chmod no
guest,anonymous
# 格式:chmod [yes/no] [real/anonymous/guest]

功能:
設置是否允許指定用戶使用chmod命令更改文件許可權。默認是

允許。
delete yes all
# 格式:delete [yes/no]
[real/anonymous/guest]
功能:

設置是否允許指定用戶使用delete命令刪除文件。默認是允許。
overwrite yes guest
#
格式:overwrite [yes/no] [real/anonymous/guest]

功能:設置是否允許指定用戶覆蓋同名文件。默認是允許。
rename yes guest
#
格式:rename [yes/no] [real/anonymous/guest]

功能:設置是否允許指定用戶使用rename命令來為文件改名。默認
是允許。
log
transfers anonymous,real inbound,outbound
# 格式:log transfers
[real/guest/anonymous] [inbound/outbound]
功能:

設置哪些用戶的上載(inbound)和下載(outbound)操作做日誌。
shutdown
/etc/shutmsg
# 格式:shutdown [文件名]

功能:
FTP伺服器關閉的時間可以設置在後面所指定的文件中,當設

置的時間一到,便無法登錄FTP伺服器了,要恢復的話只有將
這個文件刪掉。而這個文件必
須由指令/bin/ftpshut來生成。
passwd-check rfc822 warn
#
格式:passwd-check [none/trivial/rfc822] [enforce/warn]

功能:設定對匿名用戶anonymous的密碼使用方式。
none 表示不做密碼驗證,任何密碼都可以登錄;

trival 表示只要輸入的密碼中含有字元「@ 」 "Times New Roman"'>就可以登錄;

rfc822 表示密碼一定要符合RFC822中所規定的E-Mail格式才

能登錄;
enfore 表示輸入的密碼不符合以上指定的格式就不讓登錄;
warn
表示密碼不符合規定時只出現警告信息,仍然能夠登錄。
limit remote 32 Any
/etc/ftpd/toomany.msg
# 格式:limit [類別] [人數] [時間] [文件名]

功能:這個指令的功能為設置指定的時間內指定的類別允許連接的

指定人數上限。當達到上限的時候,顯示指定文件的內容。
upload /home/ftpd * no

upload /home/ftpd /pub yes anonymous 0644 dirs
# 格式:upload [根目錄]
[上載目錄] [yes/no] [用戶] [許可權]
[dirs/nodirs]

功能:對可以上載的目錄進行更加詳細的設置。
alias incoming
/home/ftp/incoming
# 格式:alias [目錄別名] [目錄名]

功能:給指定目錄設置一個別名,在切換目錄時就可以使用較短的
目錄別名。

2.
/etc/ftpusers

說明:FTP用戶黑名單,為了安全考慮,需要禁止以下用戶使用FTP
源文件:
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
news
uucp
operator
games
nobody

在眾多的網路應用中,FTP(File Transfer
porotocol)有著非常重要的地位。在Internet中一個十分重要的資源就是軟體資源。而各種各樣的軟體資源大多數都是放在FTP伺服器中的。可以說,FTP與WEB服務幾乎占據了整個Internet應用的80%以上。

FTP服務可以根據服務對象的不同分為兩類:一類是系統FTP伺服器,它只允許系統上的合法用戶使用;另一類是匿名FTP伺服器,Anonymous
FTP Server,它使用任何人都可以登錄到FTP伺服器上去獲取文件。

如果你在安裝LINUX系統的時候,在選擇啟動進程的時候選擇了「ftpd」這一項的話,安裝完LINUX系統後,它已經將一個默認的FTP伺服器安裝到系統中去了。我們已經可以利用它來實現系統FTP伺服器的功能了。我們只需在此基礎上根據我們的需要進行一些個性化設定就可以了。

熱點內容
如何刪除平板儲存密碼 發布:2025-02-07 22:10:29 瀏覽:746
php微信授權登錄 發布:2025-02-07 22:10:27 瀏覽:376
怎樣編程時鍾 發布:2025-02-07 21:59:38 瀏覽:561
誇克編程 發布:2025-02-07 21:43:43 瀏覽:528
電源450適合哪些配置 發布:2025-02-07 21:25:24 瀏覽:431
微信密碼一般要多少位以上 發布:2025-02-07 21:24:19 瀏覽:879
sqldecimal轉換 發布:2025-02-07 21:17:50 瀏覽:659
鋼管查詢源碼 發布:2025-02-07 21:15:25 瀏覽:427
濱州伺服器租賃地址 發布:2025-02-07 21:13:41 瀏覽:439
thinkphp刪除資料庫數據 發布:2025-02-07 21:12:03 瀏覽:946