+ -
当前位置:首页 → 问答吧 → 求助:怎么用openssl实现ftp文件的上传

求助:怎么用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);

作者: Danny_Share   发布时间: 2011-11-26

filezilla支持secure ftp,看看它的代码
http://sourceforge.net/projects/filezilla/

作者: masterz   发布时间: 2011-11-26