实现功能:向FTPserver以追加方式上传自己定义信息(例程中为:2014-10-08 13:47:15
test.)

源代码下载(免积分):http://download.csdn.net/detail/jipingyuan/8012533

ftp測试软件(免积分):http://download.csdn.net/detail/jipingyuan/8012381

1.sock.h

#ifndef __SOCK_H
#define __SOCK_H #define DBG(x) //printf(x)
#define SERVER_CTRL_PORT 21
#define CLIENT_CTRL_PORT 5000
#define CLIENT_DATA_PORT (CLIENT_CTRL_PORT+1)
#define BUF_SIZE 1024 extern char BufferReply[BUF_SIZE];
extern int SocketCmd;
extern int SocketData;
extern char *ServerIP;
extern int SERVER_DATA_PORT;
extern struct sockaddr_in ServerAddr_Cmd;
extern struct sockaddr_in ServerAddr_Data;
extern struct sockaddr_in ClientAddr_Cmd;
extern struct sockaddr_in ClientAddr_Data; int ClientInit(void);
int ConnectCmdSocket(void);
int SendCmmand(char *cmd);
int SendData(char *buf, int len);
int ReceiveReply(char *buffer, int len);
int CloseSocket(void); #endif

2.sock.c

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include "sock.h" char BufferReply[BUF_SIZE]={0};
int SocketCmd=0;
int SocketData=0;
char *ServerIP="10.13.0.21";
int SERVER_DATA_PORT=0;
struct sockaddr_in ServerAddr_Cmd;
struct sockaddr_in ServerAddr_Data;
struct sockaddr_in ClientAddr_Cmd;
struct sockaddr_in ClientAddr_Data; int ClientInit(void)
{
//set server addr
ServerAddr_Cmd.sin_family = AF_INET;
ServerAddr_Cmd.sin_addr.s_addr = inet_addr(ServerIP);
ServerAddr_Cmd.sin_port = htons(SERVER_CTRL_PORT); //create new socket
if((SocketCmd = socket(AF_INET, SOCK_STREAM, 0)) ==0 )
{
DBG("Create SockedCmd Failed!\n");
return -1;
}
DBG("Create socket SocketCmd.\n");
if((SocketData = socket(AF_INET, SOCK_STREAM, 0)) ==0 )
{
DBG("Create SockedData Failed!\n");
return -1;
}
DBG("Create socket SocketData.\n"); //set client addr
ClientAddr_Cmd.sin_family = AF_INET;
ClientAddr_Cmd.sin_addr.s_addr = htonl(INADDR_ANY);
ClientAddr_Cmd.sin_port = htons(CLIENT_CTRL_PORT); ClientAddr_Data.sin_family = AF_INET;
ClientAddr_Data.sin_addr.s_addr = htonl(INADDR_ANY);
ClientAddr_Data.sin_port = htons(CLIENT_DATA_PORT); //设置端口为可反复连接
int on=1;
if((setsockopt(SocketCmd, SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on)))<0)
{
DBG("setsockopt:set sock opt failed!\n");
return -1;
}
if((setsockopt(SocketData, SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on)))<0)
{
DBG("setsockopt:set sock opt failed!\n");
return -1;
} if(bind(SocketData, (struct sockaddr*)&ClientAddr_Data, sizeof(ClientAddr_Data))<0)
{
DBG("bind SockedData Failed!\n");
return -1;
}
//bind client addr
if(bind(SocketCmd, (struct sockaddr*)&ClientAddr_Cmd, sizeof(ClientAddr_Cmd))<0)
{
DBG("bind SockedCmd Failed!\n");
return -1;
} return 0;
} int ConnectCmdSocket(void)
{
if( connect (SocketCmd, (struct sockaddr*)&ServerAddr_Cmd, sizeof(ServerAddr_Cmd))<0)
{
DBG("ConnectCmdSocket:Connect Failed!\n");
CloseSocket();
return -1;
}
ReceiveReply(BufferReply, BUF_SIZE); return 0;
} int SendCmmand(char *cmd)
{
if(cmd == NULL)
return -1; int len = strlen(cmd);
if(write(SocketCmd, cmd, len)!=len)
{
DBG("SendCmmand:socket write failed!\n");
return -1;
}
ReceiveReply(BufferReply, BUF_SIZE); return 0;
} int SendData(char *buf, int len)
{
if(buf == NULL)
return -1; if(write(SocketData, buf, len)!=len)
{
DBG("SendData:socket write failed!\n");
return -1;
} return 0;
} int ReceiveReply(char *buf, int len)
{
int length=0; if( (length = read(SocketCmd, buf, len))<0 )
{
DBG("ReceiveReply:read failed!\n");
return -1;
}
printf("%s", buf);
bzero (buf, BUF_SIZE); return length;
} int CloseSocket(void)
{
if(close(SocketCmd)<0)
{
DBG("CloseSocket:close SocketData failed!\n");
return -1;
}
DBG("Close socket SocketCmd.\n"); if(close(SocketData)<0)
{
DBG("CloseSocket:close SocketData failed!\n");
return -1;
}
DBG("Close socket SocketData.\n"); return 0;
}

3.ftp.h

#ifndef __FTP_H
#define __FTP_H int Init_FTP(void);
int LogIn(char *user, char *password);
int LogOut(void);
int SendDataToFTP(char *name, char *pass, char *FileName, char *buf, int FileLen); #endif

4.ftp.c

#include <stdio.h>
#include <stdlib.h>
#include<unistd.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include "ftp.h"
#include "sock.h" int Init_FTP(void)
{
if(ClientInit()<0)
{
DBG("ClientInit Failed!\n");
return -1;
}
if(ConnectCmdSocket()<0)
{
DBG("ConnectCmdSocket Failed!\n");
return -1;
} return 0;
} int LogIn(char *user, char *password)
{
char temp[20]={0}; sprintf(temp, "USER %s\r\n", user);
if(SendCmmand(temp)<0)
{
DBG(("SendCommand failed:%s", temp));
return -1;
} sprintf(temp, "PASS %s\r\n", password);
if(SendCmmand(temp)<0)
{
DBG(("SendCommand failed:%s", temp));
return -1;
} return 0;
} int LogOut(void)
{
char *temp="QUIT\r\n"; if(SendCmmand(temp)<0)
{
DBG(("SendCommand failed:%s", temp));
CloseSocket();
return -1;
}
CloseSocket(); return 0;
} int GetPort(char *str)
{
int port=0;
char CommerCnt=0;
char *p=str;
int h=0;
int l=0; while(CommerCnt!=4)
{
if(*p == ',')
CommerCnt++;
p++;
}
h = atoi(p); p++;p++;
l = atoi(p); port = (h*256) + l;
printf("server data port=%d\n", port); return port;
} int SetDataPort(void)
{
char *cmd="PASV\r\n";
int len = strlen(cmd); if(write(SocketCmd, cmd, len)!=len)
{
DBG("SetDataPort:socket write failed!\n");
return -1;
} len=0;
if( (len = read(SocketCmd, BufferReply, 100))<0 )
{
DBG("SetDataPort:socket read failed!\n");
return -1;
}
printf("%s", BufferReply);
SERVER_DATA_PORT = GetPort (BufferReply);
bzero(BufferReply, BUF_SIZE); ServerAddr_Data.sin_family = AF_INET;
ServerAddr_Data.sin_addr.s_addr = inet_addr(ServerIP);
ServerAddr_Data.sin_port = htons(SERVER_DATA_PORT); return 0;
} int PrePareForSendData(void)
{
if(SendCmmand("TYPE I\r\n")<0)
{
DBG(("SendCommand failed:%s", "TYPE I"));
return -1;
}
if(SetDataPort()<0)
{
DBG(("SetDataPort failed!\r\n"));
return -1;
}
if( connect (SocketData, (struct sockaddr*)&ServerAddr_Data, sizeof(ServerAddr_Data))<0)
{
DBG("ConnectDataSocket:Connect Failed!\n");
return -1;
} return 0;
} int FinishForSendData(void)
{
char *temp="QUIT\r\n"; if(close(SocketData)<0)
{
DBG("FinishForSendData:close SocketData failed.\n");
close(SocketCmd);
return -1;
}
ReceiveReply(BufferReply, BUF_SIZE); if(SendCmmand(temp)<0)
{
DBG(("SendCommand failed:%s", temp));
close(SocketCmd);
return -1;
}
close(SocketCmd); return 0;
} int SendDataToFTP(char *name, char *pass, char *FileName, char *buf, int FileLen)
{
char temp[128]={0}; if(Init_FTP()<0)
{
return -1;
}
if(LogIn(name, pass)<0)
{
return -1;
} if(PrePareForSendData()<0)
{
LogOut();
return -1;
} sprintf(temp, "APPE %s\r\n", FileName);
if(SendCmmand(temp)<0)
{
DBG(("SendCommand failed:%s", temp));
LogOut();
return -1;
}
if(SendData (buf, FileLen)<0)
{
DBG("SendData failed.\n");
LogOut();
return -1;
}
FinishForSendData(); return 0;
}

5.main.c

#include <stdio.h>
#include <string.h>
#include <time.h>
#include "ftp.h" char databuf[1024]; void gettime(void)
{
time_t now=0;
struct tm *p_localtime; time(&now);
p_localtime = localtime (&now);
sprintf(databuf, "%04d-%02d-%02d %02d:%02d:%02d test.\r\n",
p_localtime->tm_year+1900,p_localtime->tm_mon+1,p_localtime->tm_mday,
p_localtime->tm_hour,p_localtime->tm_min,p_localtime->tm_sec);
printf("%s", databuf);
} int main(void)
{
gettime();
if(SendDataToFTP("plain", "cipher", "test.txt", databuf, strlen(databuf))<0)
{
printf("Send file Failed!!!!!!\n");
return -1;
}
printf("Send file Success!\n"); return 0;
}

&lt;源代码&gt;FTPclient追加方式上传自己定义信息的更多相关文章

  1. Java FTPClient实现文件上传下载

    在JAVA程序中,经常需要和FTP打交道,比如向FTP服务器上传文件.下载文件,本文简单介绍如何利用jakarta commons中的FTPClient(在commons-net包中)实现上传下载文件 ...

  2. Java FtpClient 实现文件上传服务

    一.Ubuntu 安装 Vsftpd 服务 1.安装 sudo apt-get install vsftpd 2.添加用户(uftp) sudo useradd -d /home/uftp -s /b ...

  3. Ajax方式上传文件

    用到两个对象 第一个对象:FormData 第二个对象:XMLHttpRequest 目前新版的Firefox 与 Chrome 等支持HTML5的浏览器完美的支持这两个对象,但IE9尚未支持 For ...

  4. 通过Ajax方式上传文件,使用FormData进行Ajax请求

    通过传统的form表单提交的方式上传文件: <form id= "uploadForm" action= "http://localhost:8080/cfJAX_ ...

  5. Android必知必会-使用okhttp的PUT方式上传文件

    注:如果移动端排版有问题,请看 简书版 (<-点击左边),希望CSDN能更好的支持移动端. 背景 公司的文件上传接口使用PUT协议,之前一直用的都是老项目中的上传类,现在项目中使用了okhttp ...

  6. koa2:通过Ajax方式上传文件,使用FormData进行Ajax请求

    koa2通过表单上传的网上很多,但通过Ajax方式上传文件,使用FormData进行Ajax请求,不好找. 参考了这个用base64上传图片的例子.https://github.com/Yuki-Mi ...

  7. 前端 - jquery方式 / iframe +form 方式 上传文件

    环境与上一章一样 jquery 方式上传文件: HTML代码 {#html代码开始#} <input type="file" id="img" > ...

  8. [转] 通过Ajax方式上传文件,使用FormData进行Ajax请求

    通过传统的form表单提交的方式上传文件: <form id= "uploadForm" action= "http://localhost:8080/cfJAX_ ...

  9. IOUtils方式上传下载文件

    package com.css.hdfs04; import java.io.File; import java.io.FileInputStream; import java.io.FileOutp ...

随机推荐

  1. java实现各种数据统计图(柱形图,饼图,折线图)

    近期在做数据挖掘的课程设计,须要将数据分析的结果非常直观的展现给用户,这就要用到数据统计图,要实现这个功能就须要几个第三方包了: 1.       jfreechart-1.0.13.jar 2.   ...

  2. 使用maven编译的时候提示 maven-source 1.3 中不支持注释请使用 -source 5 或更高版本以启用注释的错误。

    在编译的模块的pom文件中加上 <build> <plugins> <plugin> <groupId>org.apache.maven.plugins ...

  3. Query获取值常用

    Query获取Select选择的Text和Value:语法解释:1. $("#select_id").change(function(){//code...});   //为Sel ...

  4. js将对象转成字符串-支持微信

    最近写一个微信项目时用到了 把对象转成字符串,因为我需要把它存在cookie中,碰到了一些问题,在这里分享一下. 要转换的就是这货~ var FBinf = { "workPlacesCod ...

  5. .Net Errors

    1.Unknown column 'Extent1.Discriminator' in 'field list' Resole:http://blog.csdn.net/philip502/artic ...

  6. bootstrap 常用类名

    一. 常用类1.container居中的内容展示2.row  行内容显示3.col 列内容显示, 列必须在row 中xs 宽度小于768 ,sm宽度小于990 大于768 ,md 宽度大于990,小于 ...

  7. JavaBean和EJB的区别

    首先,EJB是指运行在EJB容器中的JavaBean.Tomcat是Web容器的参考实现.一个完整的JavaEE服务器应该包括Web容器和EJB容器.其次,Web容器中无法运行EJB,同时所有的Jav ...

  8. 带CheckBox的TreeView网上出错问题解决办法

    问题描述:TreeView上传到服务器,预览效果发现节点图片不显示.展开合并功能缺失.解决办法: 以下是我个人的解决办法,最终的效果实现了,但是还有一点点小遗憾,就是页面上有基于微软的调用js的报错信 ...

  9. android 注释常用标签

    javadoc: {@link ActivityGroup}   链接到包.类: {@link #setContentView} 用#链接到类成员: @return View The current ...

  10. axure 8.0 动态特效库分享

    认准品牌 六脉神掌 尽量给每一个交互加上效果,尽量模拟真实的交互 无图无真相,我们先看效果图 1 这是还原Android Material Design风格的一个底部菜单效果 2 这个是模拟欢迎页面 ...