求助:怎么用openssl实现ftp文件的上传
时间:2011-11-26
来源:互联网
服务器是serv-u,客户端要自己编。
下面是我已经写好的部分代码。
能登陆等让服务器创建文件,但是不能向文件里面写数据,求教啊?
帮帮忙啊
//证书过程省略,侧重数据传输
string ServerName="192.168.216.128";
unsigned short Port=990;//FTPS默认端口
string Name="name";
string Password="123";
SSL *ssl;
SOCKET controlSocket;
//1.SSL初始化
SSL_library_init();//1.1 SSL库初始化
OpenSSL_add_all_algorithms();//1.2 载入所有SSL算法
SSL_load_error_strings();//1.3 载入所有SSL错误消息
SSL_CTX *ctx = SSL_CTX_new(SSLv23_client_method()); //1.4 产生一个新的SSL CTX
//2.产生用于会话的socket
WSADATA wsaData;
WSAStartup(MAKEWORD(1, 1), &wsaData);
controlSocket = socket(AF_INET, SOCK_STREAM, 0);
//3.连接
struct sockaddr_in server_addr;
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = inet_addr(ServerName.c_str());
server_addr.sin_port = htons(Port);
//执行玩下面一句,Serv_U服务器显示有一个socket回话,但用户暂未登录
connect(controlSocket, (struct sockaddr *) (&server_addr), sizeof(struct sockaddr));
//4.产生一个新的SSL
ssl = SSL_new(ctx);
//5.把socket加入到SSL中
int ret = SSL_set_fd(ssl, controlSocket);
RAND_poll();
while (RAND_status() == 0)
{
unsigned short rand_ret = rand() % 65536;
RAND_seed(&rand_ret, sizeof(rand_ret));
}
//6.建立SSL连接
//执行完下面一句,显示已经建立SSL回话,并且有了加密密钥
ret = SSL_connect(ssl);
string temp;
temp="USER "+Name+"\r\nPASS "+Password+"\r\n";
//这一句执行好以后显示用户已经登录
SSL_write(ssl, temp.c_str(), temp.length());
string dataType="TYPE I\r\n";//二进制传输模式
SSL_write(ssl, dataType.c_str(), dataType.length());
//主动传输
UINT localsock;
CSocket sockSrvr;
CString localIP="192,168,216,1";
CString serverIP="192,168,216,128";
CString mmmm;
//创建侦听Socket
sockSrvr.Create(0,SOCK_STREAM,NULL);
sockSrvr.Listen();
sockSrvr.GetSockName(mmmm,localsock);
CString portStr;
portStr.Format(localIP+",%d,%d",localsock/256,localsock%256);
//发送Port命令主动传输文件
CString testport="PORT "+portStr+"\r\n";;
SSL_write(ssl, testport, testport.GetLength());
//在服务器上创建文件 服务器上能够正常的常见文件
testport="STOR 1.txt\r\n";
SSL_write(ssl,testport,testport.GetLength());
unsigned long lpArgument;
CAsyncSocket datachannel;
//这里三个aaa值都是1,应该说明成功协商了啊。
int aaa=sockSrvr.Accept(datachannel);
aaa=datachannel.AsyncSelect(FD_WRITE );
aaa=datachannel.IOCtl(FIONBIO,&lpArgument);
CFile datafile;
datafile.Open("D:\\1212.txt",CFile::modeRead);
int numread;
//=====================================================================================
//我这里想往在服务器端生成的1.txt里面写入数据,但是写不进去
char cbuf[50];
numread=datafile.Read(cbuf,50);
cbuf[49]=EOF;
datachannel.Send(cbuf,50,0);//问题应该是这一句,openssl估计不是这样传输的,但怎么弄啊
//==============================================================================datachannel.Close();
//释放所有连接资源
WSACleanup();
SSL_shutdown(ssl);
SSL_free(ssl);
SSL_CTX_free(ctx);
ERR_free_strings();
closesocket(controlSocket);
下面是我已经写好的部分代码。
能登陆等让服务器创建文件,但是不能向文件里面写数据,求教啊?
帮帮忙啊
//证书过程省略,侧重数据传输
string ServerName="192.168.216.128";
unsigned short Port=990;//FTPS默认端口
string Name="name";
string Password="123";
SSL *ssl;
SOCKET controlSocket;
//1.SSL初始化
SSL_library_init();//1.1 SSL库初始化
OpenSSL_add_all_algorithms();//1.2 载入所有SSL算法
SSL_load_error_strings();//1.3 载入所有SSL错误消息
SSL_CTX *ctx = SSL_CTX_new(SSLv23_client_method()); //1.4 产生一个新的SSL CTX
//2.产生用于会话的socket
WSADATA wsaData;
WSAStartup(MAKEWORD(1, 1), &wsaData);
controlSocket = socket(AF_INET, SOCK_STREAM, 0);
//3.连接
struct sockaddr_in server_addr;
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = inet_addr(ServerName.c_str());
server_addr.sin_port = htons(Port);
//执行玩下面一句,Serv_U服务器显示有一个socket回话,但用户暂未登录
connect(controlSocket, (struct sockaddr *) (&server_addr), sizeof(struct sockaddr));
//4.产生一个新的SSL
ssl = SSL_new(ctx);
//5.把socket加入到SSL中
int ret = SSL_set_fd(ssl, controlSocket);
RAND_poll();
while (RAND_status() == 0)
{
unsigned short rand_ret = rand() % 65536;
RAND_seed(&rand_ret, sizeof(rand_ret));
}
//6.建立SSL连接
//执行完下面一句,显示已经建立SSL回话,并且有了加密密钥
ret = SSL_connect(ssl);
string temp;
temp="USER "+Name+"\r\nPASS "+Password+"\r\n";
//这一句执行好以后显示用户已经登录
SSL_write(ssl, temp.c_str(), temp.length());
string dataType="TYPE I\r\n";//二进制传输模式
SSL_write(ssl, dataType.c_str(), dataType.length());
//主动传输
UINT localsock;
CSocket sockSrvr;
CString localIP="192,168,216,1";
CString serverIP="192,168,216,128";
CString mmmm;
//创建侦听Socket
sockSrvr.Create(0,SOCK_STREAM,NULL);
sockSrvr.Listen();
sockSrvr.GetSockName(mmmm,localsock);
CString portStr;
portStr.Format(localIP+",%d,%d",localsock/256,localsock%256);
//发送Port命令主动传输文件
CString testport="PORT "+portStr+"\r\n";;
SSL_write(ssl, testport, testport.GetLength());
//在服务器上创建文件 服务器上能够正常的常见文件
testport="STOR 1.txt\r\n";
SSL_write(ssl,testport,testport.GetLength());
unsigned long lpArgument;
CAsyncSocket datachannel;
//这里三个aaa值都是1,应该说明成功协商了啊。
int aaa=sockSrvr.Accept(datachannel);
aaa=datachannel.AsyncSelect(FD_WRITE );
aaa=datachannel.IOCtl(FIONBIO,&lpArgument);
CFile datafile;
datafile.Open("D:\\1212.txt",CFile::modeRead);
int numread;
//=====================================================================================
//我这里想往在服务器端生成的1.txt里面写入数据,但是写不进去
char cbuf[50];
numread=datafile.Read(cbuf,50);
cbuf[49]=EOF;
datachannel.Send(cbuf,50,0);//问题应该是这一句,openssl估计不是这样传输的,但怎么弄啊
//==============================================================================datachannel.Close();
//释放所有连接资源
WSACleanup();
SSL_shutdown(ssl);
SSL_free(ssl);
SSL_CTX_free(ctx);
ERR_free_strings();
closesocket(controlSocket);
作者: Danny_Share 发布时间: 2011-11-26
filezilla支持secure ftp,看看它的代码
http://sourceforge.net/projects/filezilla/
http://sourceforge.net/projects/filezilla/
作者: masterz 发布时间: 2011-11-26
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28