C 语言FTP

来源:互联网 发布:淘宝代理加盟 编辑:程序博客网 时间:2024/06/08 07:16

实现ftp上传,在一些情况下很简单,比如c#,或者vc6.0++中几句代码就可以,可能很多人都是这样实现的,c语言的就很少了。使用c语言可以比较好考虑的用户端,不用安装很大的运行库。当然纯粹的c语言来写,没有任何的代码让你用,一切都要重头开始,我看到很多人在找这个代码,也没见人给出来,这里贴出来方便大家

ftp本身协议很简单

发送 USER PASS进行登陆

这时可以设置传输模式 TYPE a 是ascii模式 TYPE I是二进制的,比如我们传图片或其他二进制文件都是后者

比如我们要上传一个文件

先用stor进行设置上传文件名,这时要注意,这里是写此类程序唯一的一个难点,很多人很搞混了,在具体传输数据的时候,不能再使用原来的21端口了,需要另外再建一个socket.而服务器具体接受数据的时候也为你设定一个端口。你只能在这个端口数据上传输,重点就是我们怎么知道服务器为我们设置的用来响应我们传输数据端口

ftp有两种控制模式 PASV或port模式

就拿PASV模式来说,我们传输前先 pasv \r\n

这时服务器会传过来一段数据

Entering Passtive Mode (23,122,234,21,23,12)

前面四个就是服务器地址,而后两个数据把第五个乘以256加上第六个参数就是服务器为我们设置的端口

程序如下,具体的设置为你的ftp数据

#include "stdafx.h"
#include "winsock2.h"
#include <stdio.H>
#include <stdlib.H>
#define SERVER ""
#define PORT   21
#define USERNAME ""
#define PASSWORD ""
#define MAXLEN 526
#pragma comment(lib,"ws2_32.lib")
SOCKET sctrl;
SOCKET sender;
char sendbuf[100]={0};

int split(char data[],char p[100][50],int datalen)
{
int idx=0;
int strinx=0;
memset(p[0],0,50);
for(int l=0;l<datalen;l++)
{
if(data[l]==',')
{
p[idx][strinx]='\0';
idx++;
memset(p[idx],0,50);
strinx=0;
}
else
{
p[idx][strinx]=data[l];
strinx++;
}
if(data[l]=='\0')
break;
}
return idx+1;
}


void sendCommand(char cmd[])
{
memset(sendbuf,0,100);
strcat(sendbuf,cmd);
send(sctrl,sendbuf,100,0);
memset(sendbuf,0,100);
recv(sctrl,sendbuf,100,0);
printf("信息 %s",sendbuf);
return;
}

void createdatasocket()
{

SOCKADDR_IN server;
int parts[6];
char portlist[40]={0};
int a=0;
int e=0;
int inx=0;
sendCommand("PASV \r\n");
for(int d=0;d<strlen(sendbuf);d++)
{
if(sendbuf[d]=='(')
a=d;
if(sendbuf[d]==')')
e=d;
if(sendbuf[d]=='\0')
break;
}

for(d=a+1;d<=e-1;d++)
{
portlist[inx]=sendbuf[d];
inx++;
}
char p[100][50];
split(portlist,p,sizeof(portlist));
int port=atoi(p[4])*256+atoi(p[5]);
server.sin_family=AF_INET;
server.sin_port=htons(port);
server.sin_addr.S_un.S_addr=inet_addr(SERVER);
sender=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
connect(sender,(struct sockaddr *)&server,sizeof(server));
}


int putdata(char filename[])
{
int rc; 
FILE * fp;
char buffer[526]={0};
fp=fopen(filename,"r+b");
if(fp!=NULL)
{
while( (rc = fread(buffer,sizeof(char), MAXLEN,fp)) != 0 ) 


int sendcount=send(sender,buffer,rc,0);
printf("传输了%d个字节\n",sendcount);



fclose(fp);
}
else
{
return 0;
}
closesocket(sender);
memset(sendbuf,0,100);
recv(sctrl,sendbuf,100,0);
return 1;
}


BOOL sendFTP(char remotefile[],char filename[])
{
WSADATA dwdata;
SOCKADDR_IN server;
char cmd[100]={0};
::WSAStartup(MAKEWORD(2,0),&dwdata);
server.sin_family=AF_INET;
server.sin_port=htons(PORT);
server.sin_addr.S_un.S_addr=inet_addr(SERVER);
sctrl=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
int ret;
ret=connect(sctrl,(struct sockaddr *)&server,sizeof(server));
if(ret==0)
{

recv(sctrl,sendbuf,sizeof(sendbuf),0);
memset(cmd,0,100);
wsprintf(cmd,"USER %s \r\n",USERNAME);
sendCommand(cmd);
memset(cmd,0,100);
wsprintf(cmd,"PASS %s \r\n",PASSWORD);
sendCommand(cmd);

memset(cmd,0,100);
wsprintf(cmd,"CWD %s \r\n","/www/api");
sendCommand(cmd);


memset(cmd,0,100);
strcat(cmd,"TYPE I \r\n");
sendCommand(cmd);

/*创建发送数据的socket*/

createdatasocket();

memset(cmd,0,100);
wsprintf(cmd,"STOR %s \r\n",remotefile);
sendCommand(cmd);


printf("%s\n",filename);
putdata(filename);

memset(cmd,0,100);
strcat(cmd,"QUIT \r\n");
sendCommand(cmd);

closesocket(sctrl);
}
else
{
return false;
}
WSACleanup();
return true;
}


int main(int argc, char* argv[])
{


if(!sendFTP("20081128162223.bmp","c:\\windows\\system32\\20081128162223.bmp"))
printf("服务器连接失败");
return 0;
}

原创粉丝点击