Ⅰ c語言文件傳輸
伺服器端(發送文件):首先打開文件【fopen】,用rb方式打開,既可以發送文本文件,也可以發送二進制文件,在無錯時初始化套接字socket,即初始化socket庫【WSAStartup】,分配socket【socket】,填充伺服器的地址,即填充sockaddr_in結構,然後進行綁定【bind】,設置套接字為監聽套接字【listen】,接收連接【accept】,至此伺服器阻塞,等待客戶端的連接。
客戶端(接收文件):首先打開文件【fopen】,用wb方式打開,在無錯時初始化套接字socket,即初始化socket庫【WSAStartup】,分配socket【socket】,填充客戶端的地址,即填充sockaddr_in結構,然後進行綁定【bind】,再填充伺服器的地址結構,然後調用【connect】進行連接,當連接成功後,第一階段的工作便結束了。
第二階段,發送文件。
伺服器端:使用循環while,結束條件是(!feof(fp)),fp是文件指針,feof檢測當前的文件讀取指針是否到達文件尾部,若到達了就返回真,否則返回假。然後在循環內部依次調用【fread】、【send】進行發送。這里有一個問題需要注意,調用fread的時候有兩個參數是要每次讀多少位元組和讀多少次,將第一個設置為1,將第二個設置為緩沖區的大小,用一個變數記錄實際讀到多少位元組,即【fread】的返回值,然後將其傳遞給【send】,就可以實現發送文件了,在發送完成後斷開連接【closesocket】,關閉文件【fclose】。
客戶端:使用while死循環,調用【recv】接收文件,【fwrite】寫入文件,這里也有個和上面類似的問題,就是要將recv的返回值傳遞給fwrite的第三個參數,即受到了多少位元組,就向文件中寫多少位元組。當recv返回值為0時(連接斷開時)退出循環,【closesocket】關閉套接字,調用【fclose】關閉文件。
Ⅱ 在linux中如何用C語言實現FTP上傳
你可以使用庫函數啊, 比如libftp或者libcurl(記得支持的)。 具體的用法你可以查閱相關的說明文檔。比你自己寫一個客戶端簡單多了。
Ⅲ 急求一個用VC++6.0 mfc編寫的FTP的客戶端,要求一般的上傳下載的功能,還需要斷點續傳功能
linux下有個c語言寫的命令行下載工具wget,支持斷點續傳。
因為沒有界面,看起來核心內容會容易些。
介紹與代碼下載:
http://www.gnu.org/software/wget/
支持http/ftp下載,斷點續傳參數為-c,例如
wget -c ftp://aaa.iso
Ⅳ 怎樣用FTP技術傳送文件
分類: 電腦/網路 >> 互聯網
問題描述:
怎樣用FTP技術傳送文件??也就是怎樣在兩台電腦上遠程傳輸文件。
解析:
1、先建立一個文本文件,文件名可以是任意名,例如ftp.txt,其內容如下:
open 192.168.1.100 /*遠伺服器地址或名*/
MYNAME /*用戶名MYNAME*/
MYPASSWORD /*用戶密碼MYPASSWORD*/
binary /*以二進制傳送文件,帶猜臘可選項*/
cd REMOTE_PATHNAME /*進入遠程目標路徑REMOTE_PATHNAME*/
get REMOTE_FILE LOCAL_FILE /*把兆坦遠程文件REMOTE_FILE下載成本地文件LOCAL_FILE*/
put LOCAL_FILE REMOTE_FILE /*將本地文件LOCAL_FILE上傳成蠢滑遠程文件REMOTE_FILE */
bye /*退出ftp應用*/
2、 執行以下命令:
ftp –s:ftp.txt
就完成了自動傳送。
Ⅳ 我用C#寫了一個ftp的上傳下載程序是bs架構的請問在web程序使用ftp傳輸文件有什麼好處
WEB空間是用來放網頁的,可以讓別人瀏覽到,就像虛擬空間一樣,一般伺服器需要加裝IIS或APACHE,
而FTP空間則是用來存放文件專門供下載的,也就是說,FTP空間只能上傳和下載,而不能通過IE訪問。這種伺服器不涉及到網站,一般只裝SERVE-U就可以了。
採用的傳輸協議不一樣,一個是HTTP,一個是FTP。
WEB上傳與FTP上傳的區別
WEB上傳:即通過瀏覽器(IE)來上傳文件
FTP上傳:簡稱文件傳輸協議,通過FTP上傳
1,通過IE瀏覽器上傳文件,按照"操作向導"一步步操作完成,用戶無須培訓;
1,上傳之前,需要安裝專業上傳軟體,並對軟體加以學習,用戶需要學習上傳軟體;
2,通過分配用戶許可權發布課件,簡單,安全;
2,需要建立FTP伺服器及配置設置,專業性強;
3,支持斷點續傳,支持大文件上傳;
3,不支持斷點續傳,只能重新上傳,支持大文件上傳;
4,上傳課件屬性(格式,上傳時間,人員等)自動生成,方便快捷;
4,FTP上傳後,需要從後台手工輸入課件屬性,費時費力;
5,上傳後的課件,配有審核機制,保證課件質量;
5,FTP上傳後的課件,沒有審核機制;
6,審核後的課件,自動歸類,用戶通過校園網瀏覽;
6,FTP上傳的課件後需要手工進行歸類,比較煩麻;
Ⅵ 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協議啊。。。
Ⅶ 如何在linux下用C語言寫一個向ftp伺服器用active模式傳送文件的客戶端
在絕大多數的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) 可以設置最大連接數,提高了效率,有效地控制了負載。...
Ⅷ 你好,這個你解決了嗎C語言如何用FtpPutFile()函數上傳文件到Ftp伺服器!下載用FtpGetFile()可以!
先後使用InternetOpen和InternetConnect打開連接。使用CreateFile函數打開本地文件。使用FtpOpenFile函數打開遠程文件。分別使用InternetReadFile和ReadFile函數讀取
FTP
或本地文件。分別使用InternetWriteFile和WriteFile函數寫入
FTP
或本地文件。使用CloseHandle函數關閉本地文件句柄。使用InternetCloseHandle函數關閉
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# 將FTP文件轉移到另一個FTP伺服器上如何實現
C# ftp上傳ftp
/// <summary>
/// 上傳文件
/// </summary> /
// <param name="fileinfo">需要上傳的文件</param>
/// <param name="targetDir">目標路徑</param>
/// <param name="hostname">ftp地址</param> /
// <param name="username">ftp用戶名</param> /
// <param name="password">ftp密碼</param>
public static void UploadFile(FileInfo fileinfo, string targetDir, string hostname, string username, string password)
{ //1. check target
string target;
if (targetDir.Trim() == "")
{ return; }
target = Guid.NewGuid().ToString();
//使用臨時文件名
string URI = "FTP://" + hostname + "/" + targetDir + "/" + target;
///WebClient webcl = new WebClient();
System.Net.FtpWebRequest ftp = GetRequest(URI, username, password);
//設置FTP命令 設置所要執行的FTP命令,
//ftp.Method = System.Net.WebRequestMethods.Ftp.ListDirectoryDetails;//假設此處為顯示指定路徑下的文件列表
ftp.Method = System.Net.WebRequestMethods.Ftp.UploadFile;
//指定文件傳輸的數據類型
ftp.UseBinary = true;
ftp.UsePassive = true; //告訴ftp文件大小
ftp.ContentLength = fileinfo.Length;
//緩沖大小設置為2KB
const int BufferSize = 2048;
byte[] content = new byte[BufferSize - 1 + 1];
int dataRead; //打開一個文件流 (System.IO.FileStream) 去讀上傳的文件
using (FileStream fs = fileinfo.OpenRead())
{
try { //把上傳的文件寫入流
using (Stream rs = ftp.GetRequestStream())
{ do
{ //每次讀文件流的2KB
dataRead = fs.Read(content, 0, BufferSize); rs.Write(content, 0, dataRead); }
while (!(dataRead < BufferSize)); rs.Close(); } }
catch (Exception ex) { } finally { fs.Close(); } }
ftp = null; //設置FTP命令
ftp = GetRequest(URI, username, password);
ftp.Method = System.Net.WebRequestMethods.Ftp.Rename; //改名
ftp.RenameTo = fileinfo.Name; try { ftp.GetResponse(); }
catch (Exception ex)
{
ftp = GetRequest(URI, username, password); ftp.Method = System.Net.WebRequestMethods.Ftp.DeleteFile; //刪除
ftp.GetResponse(); throw ex; } finally
{
//fileinfo.Delete(); } // 可以記錄一個日誌 "上傳" + fileinfo.FullName + "上傳到" + "FTP://" + hostname + "/" + targetDir + "/" + fileinfo.Name + "成功." );
ftp = null;
#region
/***** *FtpWebResponse * ****/ //FtpWebResponse ftpWebResponse = (FtpWebResponse)ftp.GetResponse();
#endregion
}
/// <summary>
/// 下載文件
/// </summary>
/// <param name="localDir">下載至本地路徑</param>
/// <param name="FtpDir">ftp目標文件路徑</param>
/// <param name="FtpFile">從ftp要下載的文件名</param>
/// <param name="hostname">ftp地址即IP</param>
/// <param name="username">ftp用戶名</param>
/// <param name="password">ftp密碼</param>
public static void DownloadFile(string localDir, string FtpDir, string FtpFile, string hostname, string username, string password)
{
string URI = "FTP://" + hostname + "/" + FtpDir + "/" + FtpFile;
string tmpname = Guid.NewGuid().ToString();
string localfile = localDir + @"\" + tmpname;
System.Net.FtpWebRequest ftp = GetRequest(URI, username, password);
ftp.Method = System.Net.WebRequestMethods.Ftp.DownloadFile;
ftp.UseBinary = true;
ftp.UsePassive = false;
using (FtpWebResponse response = (FtpWebResponse)ftp.GetResponse())
{
using (Stream responseStream = response.GetResponseStream())
{
//loop to read & write to file
using (FileStream fs = new FileStream(localfile, FileMode.CreateNew))
{
try
{
byte[] buffer = new byte[2048];
int read = 0;
do
{
read = responseStream.Read(buffer, 0, buffer.Length);
fs.Write(buffer, 0, read);
} while (!(read == 0));
responseStream.Close();
fs.Flush();
fs.Close();
}
catch (Exception)
{
//catch error and delete file only partially downloaded
fs.Close();
//delete target file as it's incomplete
File.Delete(localfile);
throw;
}
}
responseStream.Close();
}
response.Close();
}
try
{
File.Delete(localDir + @"\" + FtpFile);
File.Move(localfile, localDir + @"\" + FtpFile);
ftp = null;
ftp = GetRequest(URI, username, password);
ftp.Method = System.Net.WebRequestMethods.Ftp.DeleteFile;
ftp.GetResponse();
}
catch (Exception ex)
{
File.Delete(localfile);
throw ex;
}
// 記錄日誌 "從" + URI.ToString() + "下載到" + localDir + @"\" + FtpFile + "成功." );
ftp = null;
}
/// <summary>
/// 搜索遠程文件
/// </summary>
/// <param name="targetDir"></param>
/// <param name="hostname"></param>
/// <param name="username"></param>
/// <param name="password"></param>
/// <param name="SearchPattern"></param>
/// <returns></returns>
public static List<string> ListDirectory(string targetDir, string hostname, string username, string password, string SearchPattern)
{
List<string> result = new List<string>();
try
{
string URI = "FTP://" + hostname + "/" + targetDir + "/" + SearchPattern;
System.Net.FtpWebRequest ftp = GetRequest(URI, username, password);
ftp.Method = System.Net.WebRequestMethods.Ftp.ListDirectory;
ftp.UsePassive = true;
ftp.UseBinary = true;
string str = GetStringResponse(ftp);
str = str.Replace("\r\n", "\r").TrimEnd('\r');
str = str.Replace("\n", "\r");
if (str != string.Empty)
result.AddRange(str.Split('\r'));
return result;
}
catch { }
return null;
}
private static string GetStringResponse(FtpWebRequest ftp)
{
//Get the result, streaming to a string
string result = "";
using (FtpWebResponse response = (FtpWebResponse)ftp.GetResponse())
{
long size = response.ContentLength;
using (Stream datastream = response.GetResponseStream())
{
using (StreamReader sr = new StreamReader(datastream, System.Text.Encoding.Default))
{
result = sr.ReadToEnd();
sr.Close();
}
datastream.Close();
}
response.Close();
}
return result;
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Net;
/// <summary>
/// 向Ftp伺服器上傳文件並創建和本地相同的目錄結構
/// 遍歷目錄和子目錄的文件
/// </summary>
/// <param name="file"></param>
private void GetFileSystemInfos(FileSystemInfo file)
{
string getDirecName=file.Name;
if (!ftpIsExistsFile(getDirecName, "192.168.0.172", "Anonymous", "") && file.Name.Equals(FileName))
{
MakeDir(getDirecName, "192.168.0.172", "Anonymous", "");
}
if (!file.Exists) return;
DirectoryInfo dire = file as DirectoryInfo;
if (dire == null) return;
FileSystemInfo[] files = dire.GetFileSystemInfos();
for (int i = 0; i < files.Length; i++)
{
FileInfo fi = files[i] as FileInfo;
if (fi != null)
{
DirectoryInfo DirecObj=fi.Directory;
string DireObjName = DirecObj.Name;
if (FileName.Equals(DireObjName))
{
UploadFile(fi, DireObjName, "192.168.0.172", "Anonymous", "");
}
else
{
Match m = Regex.Match(files[i].FullName, FileName + "+.*" + DireObjName);
//UploadFile(fi, FileName+"/"+DireObjName, "192.168.0.172", "Anonymous", "");
UploadFile(fi, m.ToString(), "192.168.0.172", "Anonymous", "");
}
}
else
{
string[] ArrayStr = files[i].FullName.Split('\\');
string finame=files[i].Name;
Match m=Regex.Match(files[i].FullName,FileName+"+.*"+finame);
//MakeDir(ArrayStr[ArrayStr.Length - 2].ToString() + "/" + finame, "192.168.0.172", "Anonymous", "");
MakeDir(m.ToString(), "192.168.0.172", "Anonymous", "");
GetFileSystemInfos(files[i]);
}
}
}
/// <summary>
/// 判斷ftp伺服器上該目錄是否存在
/// </summary>
/// <param name="dirName"></param>
/// <param name="ftpHostIP"></param>
/// <param name="username"></param>
/// <param name="password"></param>
/// <returns></returns>
private bool ftpIsExistsFile(string dirName, string ftpHostIP, string username, string password)
{
bool flag = true;
try
{
string uri = "ftp://" + ftpHostIP + "/" + dirName;
System.Net.FtpWebRequest ftp = GetRequest(uri, username, password);
ftp.Method = WebRequestMethods.Ftp.ListDirectory;
FtpWebResponse response = (FtpWebResponse)ftp.GetResponse();
response.Close();
}
catch (Exception )
{
flag = false;
}
return flag;
}