`

一个FTP客户的简单的代码流程+简要总结分析

阅读更多
花了将近两天分析了一个1500行的FTP代码,又查阅了RFC文挡等。学习了很多东西。
组长突然通知不用FTP了, 
这里把FTP大概的一个SOCKET方式整理一下,以备以后学习使用
总的来说流程就是:
FTP分两个TCP连接,一个是控制流,一个是数据流
命令流比如是登陆啊,帮助,退出啊之类的
数据流进行数据的传输,使用的是另外的端口,如果不指定,默认用21。具体可查看RFC文档

与FTP服务器交互的流程
发送 命令格式过去,等待服务器返回,然后判断返回代码,再发
如果涉及到数据的话,有两种方式,pasv 和port
port:客户端告诉服务端使用的端口,等待服务器主动链接
pasv:由服务器告诉客户端端口,由客户端主动链接。
差别:假设客户端是在内网,那么服务器是过不了的。所以经常用公网的服务器去链接内网或者公网的客户端。

#include <iostream>
#include <winsock2.h>

#pragma comment(lib, "Ws2_32")

using namespace std;

int main(int argc, char **argv)
{
	char session_tmp[1024];
	int timeout = 10;
	unsigned short port = 21;
	char *ip = "192.168.0.238";

	struct sockaddr_in addr_client;
	SOCKET socket_fd;

	int err;
	WSADATA wsaData;
	err = WSAStartup(0x0202, &wsaData );
	if ( err != 0 ) 
	{
		{
			cout<<"[-] WSAStartup"<<endl;
		}                                 
	}


	if( (socket_fd = socket(AF_INET,SOCK_STREAM,0)) == -1)
	{
		cout<<"[-] socket"<<endl;
		return -1;
	}
	setsockopt(socket_fd, SOL_SOCKET, SO_SNDTIMEO, (char *)&timeout, sizeof(int));
	setsockopt(socket_fd, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout, sizeof(int));

	addr_client.sin_family=AF_INET;
	addr_client.sin_port = htons(port);
	addr_client.sin_addr.S_un.S_addr = inet_addr(ip);

	if( connect(socket_fd, (struct sockaddr*)&addr_client, sizeof(sockaddr)) ==-1 )
	{
		cout<<"[-] connect"<<endl;
		return -1;
	}

	int data_len;

	data_len = recv(socket_fd, session_tmp, 1024, 0);

	if( SOCKET_ERROR==data_len )
	{
		cout<<"[-] recv"<<GetLastError()<<endl;
		return -1;
	}
	session_tmp[data_len] = '\0';
	cout<<session_tmp<<endl;
	
	char name[10];
	char passwd[10];
	cout<<"name:";
	scanf("%s", name);
	cout<<endl;

	//
	_snprintf(session_tmp, sizeof(session_tmp), "USER %s\r\n",
			  name);
	data_len=send(socket_fd, session_tmp, strlen(session_tmp), 0);
	data_len=recv(socket_fd, session_tmp, 1024, 0);
	
	session_tmp[data_len]='\0';
	cout<<endl;
	cout<<session_tmp<<endl;
	//end 

	//
	cout<<"passwd:";
	scanf("%s", passwd);

	_snprintf(session_tmp, sizeof(session_tmp), "PASS %s\r\n",
			  passwd);

	data_len=send(socket_fd, session_tmp, strlen(session_tmp), 0);
	data_len=recv(socket_fd, session_tmp, 1024, 0);

	session_tmp[data_len]='\0';
	cout<<endl;
	cout<<session_tmp<<endl;
	//end 

	//ls port,client listen on a port and wait the server to connect.
	//组织好IP地址和端口号
	//用port的话,发送port命令
	//用ls查看,发送ls命令
	//accept服务器连接
	//recv。接受服务器传来的消息

	WSACleanup();


	return 0;	
}
2
1
分享到:
评论
5 楼 lin_style 2008-04-15  
没说这是JAVA啊。
4 楼 qingsongabc 2008-04-14  
这是java代码?
3 楼 lin_style 2008-04-12  
回复 AppZ
_snprintf()
函数是这样的:如果拷贝的东西超过他,那么末尾就不加'\0'
虽然说在接收服务器发送的消息,一般不会超过1024,而且也会自动加。但为了安全起见,还是手工加了个’\0‘。即在接受长度的基础上
2 楼 AppZ 2008-04-12  

session_tmp[data_len]='\0';  
请教下,这句有什么意义吗?
1 楼 lin_style 2008-04-11  
代码只是走一个流程。。

相关推荐

    VC++ FTP上传下载文件演示 实例

    WinInet是Windows操作系统内置的一个库,为应用程序提供了一种简单的接口来访问Internet服务,包括FTP。在VC++中,我们可以通过包含`#include &lt;wininet.h&gt;`头文件并链接`wininet.lib`库来使用这个API。 ### FTP上传...

    20多个c#典型实例代码

    5. 实例03:可能是一个简单的控制台应用程序,用于教学基础语法、变量、运算符和流程控制结构,如if语句、for循环等。 6. 实例07:可能涉及到异常处理,如何捕获和处理运行时错误,以确保程序的健壮性。 7. 实例12...

    notepad++ v5.98

    它内置了SciLexer.dll库,这是一个强大的语法高亮引擎,能够自动识别并为多种编程语言(如C++, Python, Java等)提供代码高亮,使得代码更易读,提高了编程效率。此外,SciLexer还支持自定义语言规则,满足不同...

    VxWorks简要手册

    - **任务模型**:多任务环境允许将一个实时应用分解为一系列独立的任务,每个任务都有自己的线程和系统资源。 - **高效的通信机制**:提供了任务间和处理器间的高效信号灯、消息队列、管道和网络透明的套接字。 - **...

    Ant入门学习 本内容包含了Ant的历史简要介绍,Ant的功能以及Ant框架的介绍,并对下载安装使用Ant进行了示例介绍,同时通过一个Java程序讲解了Ant的基本使用方法。

    例如,以下是一个简单的Ant构建文件的示例: ```xml *"/&gt; ,doc"&gt; &lt;ftp server="" userid="" password=""&gt; &lt;/ftp&gt; ``` 在这个例子中,`init`目标创建了必要的目录,`compile`目标...

    QT界面开发框架,完整资源与代码一套

    当一个对象的某个状态改变(信号触发),可以自动通知另一个对象(槽函数执行)。 4. **丰富的UI组件**:QT提供大量的预制控件,如按钮、文本框、列表视图、进度条等,可快速搭建出专业级别的界面。 5. **图形渲染**...

    ARPS usrguide

    总的来说,ARPS用户指南提供了一个从获取代码、编译运行到分析结果的全面流程,帮助用户理解和使用这个强大的气象预测系统。对于气象学家、气候研究人员以及任何需要进行大气过程模拟的人来说,这是一份非常重要的...

    linux安装rzsz.pdf

    总结而言,文档详细介绍了在Linux系统下安装RZSZ工具的完整流程,涉及了从下载源代码到编译安装的每一步操作,并强调了环境变量配置的重要性。同时,文档也简单提及了SecureCRT这款在Windows下使用的软件,以及ftp...

    Linux expect实现自动登录脚本实例代码

    Linux Expect 是一个强大的工具,它基于Tcl语言,专门用于自动化需要用户交互的任务,例如SSH登录、FTP传输等。在很多场景中,手动输入用户名和密码进行登录或执行远程命令可能会变得繁琐,尤其是在频繁操作的情况下...

    MFC下客户端与服务器端的Socket通信(PPT)

    - **Socket 对象**:为了实现客户端与服务器之间的通信,需要创建三个 Socket 对象——一个客户端 Socket (`CClientSocket`) 和两个服务器端 Socket(一个监听 Socket (`CListenSocket`) 和一个服务 Socket (`...

    python网络通信基础资料

    以下是创建多进程服务器的一个简要示例: 1. 导入multiprocessing模块。 2. 定义一个处理客户端请求的函数,该函数将接收socket作为参数。 3. 在主进程中,创建一个socket并绑定端口。 4. 当有新连接请求时,创建一...

    vb精彩编程50例.rar_VB 精_VB编程_vb 例_visual basic

    10. **网络编程**:通过Winsock控件进行简单的网络通信,如发送邮件、FTP上传下载等。 通过上述知识点的实践,VB编程50例可以帮助初学者巩固基础,提升编程技能,同时也为有经验的开发者提供参考和灵感。学习者可以...

    linux操作技巧

    GIT是一个分布式版本控制系统,用于跟踪项目开发过程中的文件变化,支持非线性开发流程,是现代软件开发中不可或缺的工具。 ### 磁盘管理 #### DF(Disk Free) DF用于显示文件系统磁盘空间使用情况,包括总容量、...

    30天学通Java项目案例开发光盘源码

    10. **chap11**:最后的章节可能是项目案例的综合实践,将前面学习的知识点整合到一个或多个实际应用项目中,如开发一个简单的Web应用或数据库管理系统。 通过这些章节的学习,学习者不仅可以掌握Java编程的基础,...

    自动化打包工具 ant-1.9.1组件包大集合

    总结来说,Apache Ant是一个强大的自动化构建工具,特别适合Java应用程序的构建流程。它通过XML格式的构建文件来定义任务和目标,提供了丰富的内置任务和扩展机制,使开发者能够定制化构建过程。Ant 1.9.1组件包大...

    墨香自动更新

    3. **说明.txt**:这是一个文本文件,通常会包含对源码的简要说明、使用方法或者开发者留下的注释。对于使用者来说,它是理解代码工作原理的重要参考资料,可能包括如何编译运行、如何配置服务器端、如何定制更新...

    PDA通讯C#实现网络通讯

    通过对服务器端和客户端的代码分析,我们了解了TCP通信的基本流程和技术细节。此外,还简要提及了JSON序列化的概念及其应用场景。这些知识对于开发人员来说是非常实用且重要的,尤其是在开发移动设备相关的应用程序...

Global site tag (gtag.js) - Google Analytics