花了将近两天分析了一个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;
}
分享到:
相关推荐
WinInet是Windows操作系统内置的一个库,为应用程序提供了一种简单的接口来访问Internet服务,包括FTP。在VC++中,我们可以通过包含`#include <wininet.h>`头文件并链接`wininet.lib`库来使用这个API。 ### FTP上传...
5. 实例03:可能是一个简单的控制台应用程序,用于教学基础语法、变量、运算符和流程控制结构,如if语句、for循环等。 6. 实例07:可能涉及到异常处理,如何捕获和处理运行时错误,以确保程序的健壮性。 7. 实例12...
它内置了SciLexer.dll库,这是一个强大的语法高亮引擎,能够自动识别并为多种编程语言(如C++, Python, Java等)提供代码高亮,使得代码更易读,提高了编程效率。此外,SciLexer还支持自定义语言规则,满足不同...
- **任务模型**:多任务环境允许将一个实时应用分解为一系列独立的任务,每个任务都有自己的线程和系统资源。 - **高效的通信机制**:提供了任务间和处理器间的高效信号灯、消息队列、管道和网络透明的套接字。 - **...
例如,以下是一个简单的Ant构建文件的示例: ```xml *"/> ,doc"> <ftp server="" userid="" password=""> </ftp> ``` 在这个例子中,`init`目标创建了必要的目录,`compile`目标...
当一个对象的某个状态改变(信号触发),可以自动通知另一个对象(槽函数执行)。 4. **丰富的UI组件**:QT提供大量的预制控件,如按钮、文本框、列表视图、进度条等,可快速搭建出专业级别的界面。 5. **图形渲染**...
总的来说,ARPS用户指南提供了一个从获取代码、编译运行到分析结果的全面流程,帮助用户理解和使用这个强大的气象预测系统。对于气象学家、气候研究人员以及任何需要进行大气过程模拟的人来说,这是一份非常重要的...
总结而言,文档详细介绍了在Linux系统下安装RZSZ工具的完整流程,涉及了从下载源代码到编译安装的每一步操作,并强调了环境变量配置的重要性。同时,文档也简单提及了SecureCRT这款在Windows下使用的软件,以及ftp...
Linux Expect 是一个强大的工具,它基于Tcl语言,专门用于自动化需要用户交互的任务,例如SSH登录、FTP传输等。在很多场景中,手动输入用户名和密码进行登录或执行远程命令可能会变得繁琐,尤其是在频繁操作的情况下...
- **Socket 对象**:为了实现客户端与服务器之间的通信,需要创建三个 Socket 对象——一个客户端 Socket (`CClientSocket`) 和两个服务器端 Socket(一个监听 Socket (`CListenSocket`) 和一个服务 Socket (`...
以下是创建多进程服务器的一个简要示例: 1. 导入multiprocessing模块。 2. 定义一个处理客户端请求的函数,该函数将接收socket作为参数。 3. 在主进程中,创建一个socket并绑定端口。 4. 当有新连接请求时,创建一...
10. **网络编程**:通过Winsock控件进行简单的网络通信,如发送邮件、FTP上传下载等。 通过上述知识点的实践,VB编程50例可以帮助初学者巩固基础,提升编程技能,同时也为有经验的开发者提供参考和灵感。学习者可以...
GIT是一个分布式版本控制系统,用于跟踪项目开发过程中的文件变化,支持非线性开发流程,是现代软件开发中不可或缺的工具。 ### 磁盘管理 #### DF(Disk Free) DF用于显示文件系统磁盘空间使用情况,包括总容量、...
10. **chap11**:最后的章节可能是项目案例的综合实践,将前面学习的知识点整合到一个或多个实际应用项目中,如开发一个简单的Web应用或数据库管理系统。 通过这些章节的学习,学习者不仅可以掌握Java编程的基础,...
总结来说,Apache Ant是一个强大的自动化构建工具,特别适合Java应用程序的构建流程。它通过XML格式的构建文件来定义任务和目标,提供了丰富的内置任务和扩展机制,使开发者能够定制化构建过程。Ant 1.9.1组件包大...
3. **说明.txt**:这是一个文本文件,通常会包含对源码的简要说明、使用方法或者开发者留下的注释。对于使用者来说,它是理解代码工作原理的重要参考资料,可能包括如何编译运行、如何配置服务器端、如何定制更新...
通过对服务器端和客户端的代码分析,我们了解了TCP通信的基本流程和技术细节。此外,还简要提及了JSON序列化的概念及其应用场景。这些知识对于开发人员来说是非常实用且重要的,尤其是在开发移动设备相关的应用程序...