c語言ftp邏輯結構
㈠ c語言中數據的邏輯結構包括什麼
沒有專用邏輯型,用數值表示真假。
0表示假
非0表示真
需要注意,近似為0的也不是0,是真,例如0.0
以上是人的表示方法。因為對於人而言,非0的數據有無數種,這些都表示真。計算機識別時,就看是不是0,是0就是假,不是0(哪怕不認識)那也是真。
如果是計算機,只認識兩個數,0和1,所以計算機向你表示真假時,只可能出現0和1兩種數字
(5>3)+2結果是3,因為5>3正確,所以5>3的返回值是1
ftp協議還是比較麻煩的,FTP上傳一般用script實現,幾行就行。若用C寫,起碼4,5百行。
㈢ 關於C語言FTP伺服器上傳數據實現方法
FTP伺服器是現成的 ? 那你就是要寫客服端咯。 看FTP協議跟socket套接字。
㈣ 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協議啊。。。
㈤ 如何在unix下,c語言中實現ftp文件傳輸
nt FtpInit(char* Host,char* Account,char* Passwd)
{
short shPortNumber;
long lAddr;
char RecvBuf[1024];
char SendBuf[1024];
int RecvLen,SendLen;
shPortNumber=htons(21);
lAddr=inet_addr(Host);
memset(HostName,0,16);
memcpy(HostName,Host,strlen(Host));
hClient=socket(AF_INET,SOCK_STREAM,0);
if (hClient<0)
{
return -1;
}
if(setsockopt(hClient,SOL_SOCKET,SO_RCVTIMEO,(char *)&rcvtime,sizeof(int)))
{
close(hClient);
return -1;
}
if(setsockopt(hClient,SOL_SOCKET,SO_KEEPALIVE,(char *)&keepalive,sizeof(int)))
{
close(hClient);
return -1;
}
SockAddr.sin_family = AF_INET;
SockAddr.sin_addr.s_addr = lAddr;
SockAddr.sin_port = shPortNumber;
if (connect(hClient,(const struct sockaddr *)&SockAddr,sizeof(SockAddr))<0)
{
close(hClient);
return -1;
}
memset(RecvBuf,0,1024);
if((RecvLen=FtpMatchReceive(hClient,RecvBuf, "220 ",1024))<=0)
{
close(hClient);
return -1;
}
if(SendLen=GetFtpSendBuf("USER",Account,SendBuf,1024)<=0)
{
close(hClient);
return -1 ;
}
if(SendFTPCommand(hClient,SendBuf)!=331)
{
close(hClient);
return -1;
}
if(SendLen=GetFtpSendBuf("PASS",Passwd,SendBuf,1024)<=0)
{
close(hClient);
return -1 ;
}
if(SendFTPCommand(hClient,SendBuf)!=230)
{
close(hClient);
return -1;
}
}
int FtpGetFile(char * FileName)
{
int hListenSocket;
int hDataSocket;
int RetWriteFile;
int ReturnCode;
char RemoteFileName[256];
char RemoteFile[256];
char ExecCommand[256];
char * pcSubDir;
memset(RemoteFileName,0,256);
memset(RemoteFile,0,256);
memset(ExecCommand,0,256);
strcpy(RemoteFileName,FileName);
memcpy(ExecCommand,"CWD ",4);
pcSubDir=strrchr(RemoteFileName,'\\');
if (pcSubDir !=NULL)
{
strncat(ExecCommand,RemoteFileName,RemoteFileName-pcSubDir);
if(SendFTPCommand(hClient,ExecCommand)!=250)
{
close(hClient);
return -1;
}
strcpy(RemoteFile,pcSubDir);
}
else
{
strcpy(RemoteFile,RemoteFileName);
}
if((hListenSocket=CreatListenSocket(hClient))<0)
{
close(hClient);
return -1;
}
if(RequestDataConnection(hClient,hListenSocket)<0)
{
close(hClient);
return -1;
}
memset( ExecCommand,0,256);
memcpy( ExecCommand,"RETR ",5);
strcat( ExecCommand,RemoteFile);
printf("The FileName=%s\n",RemoteFile);
strcat( ExecCommand,"\r\n");
ReturnCode=SendFTPCommand(hClient,ExecCommand);
if(ReturnCode!=150)
{
close(hClient);
return -1;
}
if((hDataSocket=AcceptDataConnection(hListenSocket))<0)
{
close(hClient);
return -1;
}
if((RetWriteFile=WriteFile(hDataSocket,RemoteFile))<0)
{
close(hDataSocket);
close(hClient);
return -1;
}
}
㈥ C語言的基本結構有哪些呀
◆ 基本要求
1.熟悉 Visual C++ 6.0 集成開發環境。
2.掌握結構化程序設計的方法,具有良好的程序設計風格。
3.掌握程序設計中簡單的數據結構和演算法並能閱讀簡單的程序。
4.在 Visual C++ 6.0 集成環境下,能夠編寫簡單的C程序,並具有基本的糾錯和調試程序的能力
◆ 考試內容
一、C語言程序的結構
1.程序的構成,main函數和其他函數。
2.頭文件,數據說明,函數的開始和結束標志以及程序中的注釋。
3.源程序的書寫格式。
4.C語言的風格。
二、數據類型及其運算
1.C的數據類型(基本類型,構造類型,指針類型,無值類型)及其定義方法。
2.C運算符的種類、運算優先順序和結合性。
3.不同類型數據間的轉換與運算。
4.C表達式類型(賦值表達式,算術表達式,關系表達式,邏輯表達式,條件表達式,逗號表達式)和求值規則。
三、基本語句
1.表達式語句,空語句,復合語句。
2.輸入輸出函數的調用,正確輸入數據並正確設計輸出格式。
四、選擇結構程序設計
1.用if語句實現選擇結構。
2.用switch語句實現多分支選擇結構。
3.選擇結構的嵌套。
五、循環結構程序設計
1.for循環結構。
2.while和do-while循環結構。
3.continue語句和break語句。
4.循環的嵌套。
六、數組的定義和引用
1.一維數組和二維數組的定義、初始化和數組元素的引用。
2.字元串與字元數組。
七、函數
1.庫函數的正確調用。
2.函數的定義方法。
3.函數的類型和返回值。
4.形式參數與實在參數,參數值傳遞。
5.函數的正確調用,嵌套調用,遞歸調用。
6.局部變數和全局變數。
7.變數的存儲類別(自動,靜態,寄存器,外部),變數的作用域和生存期。
八、編譯預處理
1.宏定義和調用(不帶參數的宏,帶參數的宏)。
2.「文件包含」處理。
九、指針
1.地址與指針變數的概念,地址運算符與間址運算符。
2.一維、二維數組和字元串的地址以及指向變數、數組、字元串、函數、結構體的指針變數的定義。通過指針引用以上各類型數據。
3.用指針作函數參數。
4.返回地址值的函數。
5.指針數組,指向指針的指針。
十、結構體(即「結構」)與共同體(即「聯合」)
1.用typedef說明一個新類型。
2.結構體和共用體類型數據的定義和成員的引用。
3.通過結構體構成鏈表,單向鏈表的建立,結點數據的輸出、刪除與插入。
十一、位運算
1.位運算符的含義和使用。
2.簡單的位運算。
十二、文件操作
只要求緩沖文件系統(即高級磁碟I/O系統),對非標准緩沖文件系統(即低級磁碟I/O系統)不要求。
1.文件類型指針(FILE類型指針)。
2.文件的打開與關閉(fopen,fclose)。
3.文件的讀寫(fputc,fgetc,fputs,fgets,fread,fwrite,fprintf,fscanf函數的應用),文件的定位(rewind,fseek函數的應用)。
◆ 考試方式
1.筆試:90分鍾,滿分100分,其中含公共基礎知識部分的30分。
2.上機:90分鍾,滿分100分
3、上機操作包括:
(1)填空。
(2)改錯。
(3)編程。
㈦ unix下用c語言實現一個基於ftp的文件傳輸的client
貌似 Linux 下可以直接使用 ftp 命令
Red Hat 9.0自帶VSFTP,你配置好後,別人可
以直接通過終端上傳下載文件,至於怎麼用C
語言實現,不好意思,哥們兒不會。
用C的system函數調用 ftp 命令
unix下面也有ftp啊
int ftpcmd(int sockftp,char *fmt,...) //cmd
{
va_list vp;
int err,len;
int i,j,n,p;
if (ftpio == NULL)
{
ftpio = fdopen(sockftp,"r"); //socket->file pointer
if (ftpio == NULL)
return -1;
}
if (fmt)
{
va_start(vp,fmt);
len = vsprintf(ftp_buf,fmt,vp);
ftp_buf[len++] = '\r';
ftp_buf[len++]='\n';
write(sockftp,ftp_buf,len); //buf->socket
}
n=read(sockftp,ftp_buffer,sizeof(ftp_buffer));
printf("the buff is %s\n",ftp_buffer);
if(fmt=="PASV") //被動模式下提取需要連接服務端的埠
{
ftp_buffer[n-3]='\0';
str1=ftp_buffer+39;
str2=strchr(str1,',');
i=atoi(str2+1);
n=0;
while(str1[n]!=',')
{
str3[n]=str1[n];
n++;
}
j=atoi(str3);
p=j*256+i;
return p;
}
return 1;
}
int ftp()
{
char *host="ftp.tust.e.cn";
char *user="ejia";
char *pass="ejia2094ejia";
char *filename="net";
char *savefile="net";
int sockftp = -1,sockdata = -1,sockxfer = -1;
struct sockaddr_in addr;
unsigned long hostip;
int len,tmp,err,err1;
int retval = -1;
int savefd;
char *del=":";
char *port;
struct hostent *he;
hostip = inet_addr(host); //ip
sockftp = socket(AF_INET,SOCK_STREAM,0); //control socket
if (sockftp == -1)
goto out;
addr.sin_family = PF_INET;
addr.sin_port = htons(21);
addr.sin_addr.s_addr = hostip;
if (connect(sockftp,(struct sockaddr *)&addr,sizeof(addr)) == -1) //wait for connect
goto out;
err = ftpcmd(sockftp,NULL); //connect ftp server
err = ftpcmd(sockftp,"USER %s",user);
err = ftpcmd(sockftp,"PASS %s",pass);
err = ftpcmd(sockftp,"TYPE I");
err1 = ftpcmd(sockftp,"PASV");
tmp = sizeof(addr);
sockdata = socket(AF_INET,SOCK_STREAM,0); //data socket
if (sockdata == -1)
goto out;
memset(&addr,0,tmp);
addr.sin_family = AF_INET;
addr.sin_port = htons(err1);
addr.sin_addr.s_addr = inet_addr(host);;
sockxfer = connect(sockdata,&addr,tmp);
if (sockxfer == -1)
goto out;
err=ftpcmd(sockftp,"RETR %s",filename);
/*savefd = open(savefile,O_RDWR | O_CREAT); //create file
if (savefd == -1)
goto out; */
len=read(sockdata,ftp_buf,sizeof(ftp_buf));
client_ip=strtok(ftp_buf,del);
port=strtok(NULL,del);
client_port=atoi(port);
printf("the cilentip is %s,the port is %d\n",client_ip,client_port);
/*write(savefd,ftp_buf,len);
close(savefd);*/
out:
close(sockxfer);
close(sockdata);
close(sockftp);
}
注意一下四樓沒包含庫文件
<sys/un.h>
<netinet/in.h>
<sys/socket.h>
<netdb.h>
<arpa/inet.h>
當然還有<unistd.h>
介紹本書《高級UNIX編程》外文翻譯的,
裡面講得很詳細。
㈧ 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伺服器的功能了。我們只需在此基礎上根據我們的需要進行一些個性化設定就可以了。