zoukankan      html  css  js  c++  java
  • <源代码>FTPclient追加方式上传自己定义信息

    实现功能:向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!
    ");
    		return -1;
    	}
    	DBG("Create socket SocketCmd.
    ");
    	if((SocketData = socket(AF_INET, SOCK_STREAM, 0)) ==0 )
    	{
    		DBG("Create SockedData Failed!
    ");
    		return -1;
    	}
    	DBG("Create socket SocketData.
    ");
    
    	//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!
    ");
    		return -1;
    	}
    	if((setsockopt(SocketData, SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on)))<0)  
    	{  
    		DBG("setsockopt:set sock opt failed!
    ");
    		return -1;
    	}
    
    	if(bind(SocketData, (struct sockaddr*)&ClientAddr_Data, sizeof(ClientAddr_Data))<0)
    	{
    		DBG("bind SockedData Failed!
    ");
    		return -1;
    	}
    	//bind client addr
    	if(bind(SocketCmd, (struct sockaddr*)&ClientAddr_Cmd, sizeof(ClientAddr_Cmd))<0)
    	{
    		DBG("bind SockedCmd Failed!
    ");
    		return -1;
    	}
    
    	return 0;
    }
    
    int ConnectCmdSocket(void)
    {
    	if( connect (SocketCmd, (struct sockaddr*)&ServerAddr_Cmd, sizeof(ServerAddr_Cmd))<0)
    	{
    		DBG("ConnectCmdSocket:Connect Failed!
    ");
    		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!
    ");
    		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!
    ");
    		return -1;
    	}
    
    	return 0;
    }
    
    int ReceiveReply(char *buf, int len)
    {
    	int length=0;
    
    	if( (length = read(SocketCmd, buf, len))<0 )
    	{
    		DBG("ReceiveReply:read failed!
    ");
    		return -1;
    	}
    	printf("%s", buf);
    	bzero (buf, BUF_SIZE);
    
    	return length;
    }
    
    int CloseSocket(void)
    {
    	if(close(SocketCmd)<0)
    	{
    		DBG("CloseSocket:close SocketData failed!
    ");
    		return -1;
    	}
    	DBG("Close socket SocketCmd.
    ");
    		
    	if(close(SocketData)<0)
    	{
    		DBG("CloseSocket:close SocketData failed!
    ");
    		return -1;
    	}
    	DBG("Close socket SocketData.
    ");
    	
    	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!
    ");
    		return -1;
    	}
    	if(ConnectCmdSocket()<0)
    	{
    		DBG("ConnectCmdSocket Failed!
    ");
    		return -1;
    	}
    	
    	return 0;
    }
    
    int LogIn(char *user, char *password)
    {
    	char temp[20]={0};
    	
    	sprintf(temp, "USER %s
    ", user);
    	if(SendCmmand(temp)<0)
    	{
    		DBG(("SendCommand failed:%s", temp));
    		return -1;
    	}
    	
    	sprintf(temp, "PASS %s
    ", password);
    	if(SendCmmand(temp)<0)
    	{
    		DBG(("SendCommand failed:%s", temp));
    		return -1;
    	}
    		
    	return 0;
    }
    
    int LogOut(void)
    {	
    	char *temp="QUIT
    ";
    	
    	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
    ", port);
    	
    	return port;
    }
    
    int SetDataPort(void)
    {
    	char *cmd="PASV
    ";
    	int len = strlen(cmd);
    	
    	if(write(SocketCmd, cmd, len)!=len)
    	{
    		DBG("SetDataPort:socket write failed!
    ");
    		return -1;
    	}
    	
    	len=0;
    	if( (len = read(SocketCmd, BufferReply, 100))<0 )
    	{
    		DBG("SetDataPort:socket read failed!
    ");
    		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
    ")<0)
    	{
    		DBG(("SendCommand failed:%s", "TYPE I"));
    		return -1;
    	}
    	if(SetDataPort()<0)
    	{
    		DBG(("SetDataPort failed!
    "));
    		return -1;
    	}
    	if( connect (SocketData, (struct sockaddr*)&ServerAddr_Data, sizeof(ServerAddr_Data))<0)
    	{
    		DBG("ConnectDataSocket:Connect Failed!
    ");
    		return -1;
    	}
    	
    	return 0;
    }
    
    int FinishForSendData(void)
    {
    	char *temp="QUIT
    ";
    
    	if(close(SocketData)<0)
    	{
    		DBG("FinishForSendData:close SocketData failed.
    ");
    		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
    ", FileName);
    	if(SendCmmand(temp)<0)
    	{
    		DBG(("SendCommand failed:%s", temp));
    		LogOut();
    		return -1;
    	}
    	if(SendData (buf, FileLen)<0)
    	{
    		DBG("SendData failed.
    ");
    		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.
    ",
    	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!!!!!!
    ");
    		return -1;
    	}
    	printf("Send file Success!
    ");
        
        return 0;
    }


  • 相关阅读:
    Zebra命令模式分析(一)  分析
    sublime text2
    开源路由软件zebra的命令存储原理及使用方法
    开源路由软件zebra介绍和和在Linux环境下的安装
    jQuery删除节点
    如何成为一名软件架构师
    jQuery中的DOM操作
    编写自己的Shell解释器
    Notepad++集成VC2010环境
    ffmpeg使用语法
  • 原文地址:https://www.cnblogs.com/blfshiye/p/4061798.html
Copyright © 2011-2022 走看看