⑴ ftp協議和TCP協議,什麼關系如何理解socket
FTP,TCP是跑在網路上的協議,就好像MP3,WMA格式的音樂一樣。FTP主要用於文件的傳輸,TCP可以跑HTML,圖像,超鏈SOCKET是將TCP,UDP協議的功能打包使用,一般給開發人員用的。
⑵ 使用socket編寫ftp,一台機器又作伺服器又作客戶端,為什麼客戶端能連上伺服器,而伺服器連不上客戶端呢
你給出的代碼不是關鍵的代碼呀,把關於bind,accept,conncet三個函數相關的東西放上來看下呀。
一般而言:伺服器連不上客戶端是因為客戶端沒有提供服務。(UDP)
對於TCP而言,相信沒有連接不上的問題,只是主動與被動的問題,因為TCP協議多數是用在(C/S)模式。如果不不明白請將關鍵代碼示出。
⑶ 用SOCKET實現FTP
我知道,M我,我告訴你.
⑷ 我在用C++的SOCKET寫一個簡單的FTP伺服器,需要把本地目錄發給客戶端,請問當用戶發送"LIST"命令時,怎麼
看你的伺服器是基於什麼系統了。如果是unix/linux系統,你可以用系統調用來讀取當前目錄下的文件列表(包括目錄,目錄也是文件),通常這個步驟只需要一個循環。通過這個步驟其實你就可以到了當前目錄下的文件名,然後你只需把這些文件名發送給客戶端就可以了。當然,這是最簡單的方式。你也是可以根據自己的喜好,把文件的訪問許可權,擁有者等信息,按照一定的格式發給客戶端。
對於windows系統,處理方式與此類似,只不過把讀取當前目錄下的文件列表的系統調用換成windows相應的調用即可。
⑸ socket編程:FTP協議客戶端 CAsynSocket類的問題
我之前寫過一個示例的FTP伺服器。FTP協議和HTTP協議一樣,都是屬於一問一答的,當你的命令連接與FTP伺服器連接後,就要等待響應伺服器的歡迎信息 220, 然後再發送請求進行登陸,發送完後不要再發送其他命令了,一定要等剛剛的請求響應完成。所以你不要一次性把4個命令全部發送過去。一定要保證一問一答。
⑹ 用socket寫FTP客戶端問題
是的。
需要有兩個套接字,一個用於命令(cmdSocket),一個用於數據(dataSocket)
cmdSocket與ftp伺服器21埠(如果ftp伺服器沒做特殊設置的話)連接,dataSocket因PASV和PORT模式不同,而有所差別。
PASV模式:
1)通過命令cmdSocket套接字發送PASV
2)server端會返回ip地址和專門的數據傳輸埠號
3)在命令套接字cmdSocket上發送LIST命令
4)本地建立dataSocket連接server提供的數據傳輸埠號(此步中,本地作為客戶端)
5)server端通過cmdSocket返回150 開頭的響應(需要讀取cmdSocket)
6)本地通過dataSocket接收數據,即通過dataSocket的inputStream讀取dataSocket中的數據
7)傳輸完畢(read返回-1),cmdSocket會返回226 開頭的響應,關閉連接即可
PORT模式:
1)在本地啟動某個埠的監聽(本地作為服務端,使用ServerSocket)
2)通過命令cmdSocket套接字發送PORT,PORT命令後加參數:本地ip+剛啟動監聽的埠
3)server端響應200
4)在cmdSocket上發送LIST命令
5)調用ServerSocket.accept()獲得數據套接字dataSocket(ftp server作為客戶連接本地的埠)
6)server端通過cmdSocket返回150 開頭的響應(需要讀取cmdSocket)
7)本地通過dataSocket接收數據,即通過dataSocket的inputStream讀取dataSocket中的數據
8)傳輸完畢(read返回-1),cmdSocket會返回226 開頭的響應,關閉連接即可
⑺ 用linux socket寫ftp遇到的問題(程序最後一行)
char sendbuff[]="USER sail\r\n";
⑻ java用socket編寫ftp的客戶端程序。大概要什麼步驟(登錄,顯示文件,下載上傳就行)
登陸。需要伺服器
顯示文件, 使用IO獲取伺服器某位置的文件就是了
下載上傳,用流傳輸。。
⑼ C# socket ftp
要用ftp協議來實現,下面是對文件的操作,裡面有獲取文件列表的方法
#region 文件操作
/// <summary>
/// 獲得文件列表
/// </summary>
/// <param name= "strMask "> 文件名的匹配字元串 </param>
/// <returns> </returns>
public string[] Dir(string strMask)
{
// 建立鏈接
if(!bConnected)
{
Connect();
}
//建立進行數據連接的socket
Socket socketData = CreateDataSocket();
//傳送命令
SendCommand( "NLST " + strMask);
//分析應答代碼
if(!(iReplyCode == 150 || iReplyCode == 125 || iReplyCode == 226))
{
throw new IOException(strReply.Substring(4));
}
//獲得結果
strMsg = " ";
while(true)
{
int iBytes = socketData.Receive(buffer, buffer.Length, 0);
strMsg += ASCII.GetString(buffer, 0, iBytes);
if(iBytes < buffer.Length)
{
break;
}
}
char[] seperator = { '\n '};
string[] strsFileList = strMsg.Split(seperator);
socketData.Close();//數據socket關閉時也會有返回碼
if(iReplyCode != 226)
{
ReadReply();
if(iReplyCode != 226)
{
throw new IOException(strReply.Substring(4));
}
}
return strsFileList;
}
/// <summary>
/// 獲取文件大小
/// </summary>
/// <param name= "strFileName "> 文件名 </param>
/// <returns> 文件大小 </returns>
private long GetFileSize(string strFileName)
{
if(!bConnected)
{
Connect();
}
SendCommand( "SIZE " + Path.GetFileName(strFileName));
long lSize=0;
if(iReplyCode == 213)
{
lSize = Int64.Parse(strReply.Substring(4));
}
else
{
throw new IOException(strReply.Substring(4));
}
return lSize;
}
/// <summary>
/// 刪除
/// </summary>
/// <param name= "strFileName "> 待刪除文件名 </param>
public void Delete(string strFileName)
{
if(!bConnected)
{
Connect();
}
SendCommand( "DELE "+strFileName);
if(iReplyCode != 250)
{
throw new IOException(strReply.Substring(4));
}
}
/// <summary>
/// 重命名(如果新文件名與已有文件重名,將覆蓋已有文件)
/// </summary>
/// <param name= "strOldFileName "> 舊文件名 </param>
/// <param name= "strNewFileName "> 新文件名 </param>
public void Rename(string strOldFileName,string strNewFileName)
{
if(!bConnected)
{
Connect();
}
SendCommand( "RNFR "+strOldFileName);
if(iReplyCode != 350)
{
throw new IOException(strReply.Substring(4));
}
// 如果新文件名與原有文件重名,將覆蓋原有文件
SendCommand( "RNTO "+strNewFileName);
if(iReplyCode != 250)
{
throw new IOException(strReply.Substring(4));
}
}
#endregion
⑽ 有 FTP 協議可用,也可自己直接用 Socket API (MFC有CSocket類) 實現,謝謝你!
Win API 還有一個傳輸文件的函數 TransmitFile,它結合Socket實現。你搜資料弄明白Socket 相關原理後就容易實現文件(數據)傳輸了。