FTP 编写 4:命令解析

java连接ftp并读取解析上面的文件 一、开发环境 1.IDE:IDEA 2017 2.JDK:1.8 3.浏览器:谷歌浏览器 4.框架:springboot 5.数据库:Oracle 二、业务背景 数据采集处理程序,需要每天定时从ftp服务器上采集一个以日期(yyyymmdd.dat)命名的文件,每天会定时上传一个新的文件到ftp服务器上。 任务:使用程序连接ftp服务器,并且读取到当天上传的文件并解析成指定格式将数据存储到数据库中... 阅读详情

FTP 编写 4:命令解析


    我们知道在现实生活中使用的 FTP 是应答式的,客户端和服务端按照一定的规定进行交流,不是随便弄的,在上几篇中的 FTP 没有人机交互的功能。所以这篇文章的主要内容是按照平时 FTP 的交流规则重构一下整个工程的代码,并加入命令解析功能。

命令解析

    这部分命令解析只是简单模拟一下 FTP 的,在 FTP 的规则中还有应答返回值的规定,现在把它省略,简单定义一下服务端和客户端的交流规则

    现在的交流过程是这样的:在服务端和客户端启动以后,客户端向服务端发起连接,然后服务端向客户端发送一条欢迎信息;然后等待客户端发送相应的指令,根据指令进行答复和操作

//命令解析函数:将受到的命令进行分解,用字符分割函数分成指令和参数两部分
int Client::commandParse(char * instruck, std::string & paramter)
{
    std::string string(buf);
    std::cout << string;
    std::vector<std::string> command;
    //以空格为分隔符进行分割
    Tool::splitString(string, command, std::string(" "));

    //判断传入的参数个数是否正确
    if (command.size() != 2) {
        paramter = "";
        return -1;
    }

    //返回相应指令对应的数值
    if (command[0] == "STOR") {
        paramter = command[1];
        return 1;
    }
    if (command[0] == "RETR") {
        paramter = command[1];
        return 2;
    }

    //默认返回错误指令
    return 0;
}

//字符分割函数
void Tool::splitString(const std::string & input, std::vector<std::string>& output, std::string &delim)
{
    std::string::size_type pos1, pos2;
    pos1 = 0;
    pos2 = input.find(delim);

    while (std::string::npos != pos2)
    {
        output.push_back(input.substr(pos1, pos2 - pos1));

        pos1 = pos2 + delim.size();
        pos2 = input.find(delim, pos1);
    }
    if (pos1 != input.length())
        output.push_back(input.substr(pos1));
}

服务端重构

    服务端的重构主要是将服务端运行的部分抽离出来写成一个类,类中包含了服务端的所有功能函数,并且在多线程中运行,服务端中的运行函数如下:

void Server::running()
{
    //与客户端进行连接以后就发送一个欢迎信息
    welcome();

    //然后进入无限循环,等待客户端的命令进行下一步操作
    while (true) {
        if (recv(server, buf, maxLen, 0) == 0) {
            std::cout << "recv() Faied!\n";
        }

        std::string paramter;
        int cmd = commandParse(buf, paramter);

        switch (cmd) {
        case 0:
            std::cout << "Command is invalid\n";
            break;

        case 1:
            std::cout << "Start receive the file from client.\n";
            receiveFile(paramter);
            break;

        case 2:
            std::cout << "Start send file to client.\n";
            sendFile(paramter);
            break;

        default:
            std::cout << "Command is invalid\n";
        }
    }
}

客户端重构

    客户端也是将功能封装到一个类里面,但不需要多线程,运行函数如下:

void Client::running()
{
    memset(buf, 0, sizeof(buf));
    if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
        std::cout << "Failed to load Winsock\n";
        system("pause");
        return;
    }

    //char addr[20] = "113.54.167.16";
    char addr[20] = "192.168.1.119";

    //创建Socket
    ser.sin_family = AF_INET;
    ser.sin_port = htons(iPort);
    inet_pton(AF_INET, addr, (void*)&ser.sin_addr.s_addr);
    client = socket(AF_INET, SOCK_STREAM, 0);
    if (client == INVALID_SOCKET) {
        std::cout << "socket() Failed\n";
        system("pause");
        return;
    }

    //连接并进行简单的操作
    if (connect(client, (struct sockaddr*)&ser, sizeof(ser)) == INVALID_SOCKET) {
        std::cout << "connect() Failed\n";
        system("pause");
        return;
    }
    else {
        //接收服务端发送的数据
        iLen = recv(client, buf, sizeof(buf), 0);
        if (iLen == 0) {
            system("pause");
            return;
        }
        else if (iLen == SOCKET_ERROR) {
            std::cout << "recv() Failed\n";
            system("pause");
            return;
        }
        std::cout << "recv() data from server:" << buf << std::endl;
    }

    while (true) {
        //输入相应的数据发送给服务端
        std::cout << ">>";
        std::cin.getline(buf, 1024);

        std::string paramter;
        int cmd = commandParse(buf, paramter);

        switch (cmd) {
        case 0:
            std::cout << "Command is invalid\n";
            break;

        case 1:
            std::cout << "Start receive the file from client.\n";
            downloadFile(paramter);
            break;

        case 2:
            std::cout << "Start send file to client.\n";
            uploadFile(paramter);
            break;

        default:
            std::cout << "Command is invalid\n";
        }
    }
}

源代码

客户端
//main.cpp
#pragma comment(lib,"ws2_32.lib")

#include "Client.h"

void main()
{
    Client client;
    client.running();
    system("pause");
}

//Client.h
#pragma once
#include <WinSock2.h>
#include <string>

class Client
{
public:
    Client();
    ~Client();

    void running();
    bool uploadFile(std::string file);
    bool downloadFile(std::string file);
    int commandParse(char* instruck, std::string &paramter);

private:
    SOCKET client;
    char buf[1024];
    //定义相应的数据
    WSADATA wsaData;
    int iPort = 5050;//对应的服务端的端口
    int iLen, iSend;
    struct sockaddr_in ser;

};

//Client.cpp
#include "Client.h"
#include "Tool.h"

#include <iostream>
#include <WS2tcpip.h>

Client::Client()
{
}


Client::~Client()
{
    //关闭连接并退出
    closesocket(client);
    //关闭 Winsock
    WSACleanup();
}

void Client::running()
{
    memset(buf, 0, sizeof(buf));
    if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
        std::cout << "Failed to load Winsock\n";
        system("pause");
        return;
    }

    //char addr[20] = "113.54.167.16";
    char addr[20] = "192.168.1.119";

    //创建Socket
    ser.sin_family = AF_INET;
    ser.sin_port = htons(iPort);
    inet_pton(AF_INET, addr, (void*)&ser.sin_addr.s_addr);
    client = socket(AF_INET, SOCK_STREAM, 0);
    if (client == INVALID_SOCKET) {
        std::cout << "socket() Failed\n";
        system("pause");
        return;
    }

    //连接并进行简单的操作
    if (connect(client, (struct sockaddr*)&ser, sizeof(ser)) == INVALID_SOCKET) {
        std::cout << "connect() Failed\n";
        system("pause");
        return;
    }
    else {
        //接收服务端发送的数据
        iLen = recv(client, buf, sizeof(buf), 0);
        if (iLen == 0) {
            system("pause");
            return;
        }
        else if (iLen == SOCKET_ERROR) {
            std::cout << "recv() Failed\n";
            system("pause");
            return;
        }
        std::cout << "recv() data from server:" << buf << std::endl;
    }

    while (true) {
        //输入相应的数据发送给服务端
        std::cout << ">>";
        std::cin.getline(buf, 1024);

        std::string paramter;
        int cmd = commandParse(buf, paramter);

        switch (cmd) {
        case 0:
            std::cout << "Command is invalid\n";
            break;

        case 1:
            std::cout << "Start receive the file from client.\n";
            downloadFile(paramter);
            break;

        case 2:
            std::cout << "Start send file to client.\n";
            uploadFile(paramter);
            break;

        default:
            std::cout << "Command is invalid\n";
        }
    }
}

bool Client::uploadFile(std::string file)
{
    return false;
}

bool Client::downloadFile(std::string file)
{
    return false;
}

int Client::commandParse(char * instruck, std::string & paramter)
{
    std::string string(buf);
    std::cout << string;
    std::vector<std::string> command;
    Tool::splitString(string, command, std::string(" "));

    if (command.size() != 2) {
        paramter = "";
        return -1;
    }

    if (command[0] == "STOR") {
        paramter = command[1];
        return 1;
    }
    if (command[0] == "RETR") {
        paramter = command[1];
        return 2;
    }

    return 0;
}
服务端
//main.cpp
#include <Winsock2.h>
#include <Ws2tcpip.h>
#include <iostream>
#include <thread>
#include <vector>
#pragma comment(lib,"ws2_32.lib")

#include "Server.h"

//多线程函数,创建的多线程运行此函数
void server(SOCKET s);

void main()
{
    //定义相关的数据
    int iPort = 5050;//定义其端口
    WSADATA wsaData;//Winsock 的启动参数
    SOCKET sListen, sAccept;//套接口关键字,分别用于监听和接收连接
    int iLen;
    int iSend;
    char buf[] = "I am a server";
    struct sockaddr_in ser, cli;//网络地址
    //定义多线程指针,用于创建线程
    std::thread* t;
    //用于线程的管理,保存创建的多线程指针,程序结束时释放占用的内存
    std::vector<std::thread*> tManage;
    Server* server = NULL;


    std::cout << "----------------------------\n";
    std::cout << "Server waitting\n";
    std::cout << "----------------------------\n";

    //启动winSocket
    if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
        std::cout << "Failed to load Winsock.\n";
        return;
    }

    //创建Socket
    sListen = socket(AF_INET, SOCK_STREAM, 0);
    if (sListen == INVALID_SOCKET) {
        std::cout << "socket() Failed:" << WSAGetLastError() <<"\n";
        return;
    }

    //绑定IP地址
    ser.sin_family = AF_INET;
    ser.sin_port = htons(iPort);
    ser.sin_addr.s_addr = htonl(INADDR_ANY);
    if (bind(sListen, (LPSOCKADDR)&ser, sizeof(ser)) == SOCKET_ERROR) {
        std::cout << "bind() Failed\n";
        return;
    }

    //监听
    if (listen(sListen, 5) == SOCKET_ERROR) {
        std::cout << "listen() Failed\n";
        return;
    }

    iLen = sizeof(cli);//获取客户端网络地址的长度

    //接受连接和发送欢迎信息
    //用循环使程序一直运行
    while (true) {
        //接收连接
        sAccept = accept(sListen, (struct sockaddr*)&cli, &iLen);
        if (sAccept == INVALID_SOCKET) {
            std::cout << "accept() Failed\n";
            break;
        }

        //创建新的线程,并加入容器中,并将线程后台运行
        //t = new std::thread(server, sAccept);
        //tManage.push_back(t);
        //t->detach();
        server = new Server(sAccept);
        t = new std::thread(&Server::running, server);
        tManage.push_back(t);
        t->detach();
    }

    //释放指针占用的内存
    for (int i = 0; i < tManage.size(); i++) {
        delete(tManage[i]);
    }

    //关闭监听
    closesocket(sListen);
    //关闭 Winsock
    WSACleanup();
}

//多线程函数,创建的多线程运行此函数
void server(SOCKET s) {
    SOCKET socket = s;
    struct sockaddr_in ser, cli;//网络地址
    int iSend, iRecv;
    char buf[1024] = "I am a server";

    //显示客户端的 IP 信息
    char clibuf[20] = { '\0' };
    inet_ntop(AF_INET, (void*)&cli.sin_addr, clibuf, 16);
    std::cout << "Accept client IP:" << clibuf << ":" << ntohs(cli.sin_port) << std::endl;

    //发送信息给客户端
    iSend = send(socket, buf, sizeof(buf), 0);
    if (iSend == SOCKET_ERROR) {
        std::cout << "send() Failed\n";
    }
    else if (iSend == 0) {
        std::cout << "send() Zero\n";
    }
    else {
        std::cout << "Send byte:" << iSend << std::endl;
        std::cout << "----------------------------------\n";
    }

    //使用循环不断接受客户端发送来的信息并显示
    while (true) {
        iRecv = recv(socket, buf, sizeof(buf), 0);
        if (iRecv == 0) {
            //std::cout << "recv() Zero\n";
        }
        else if (iRecv == SOCKET_ERROR) {
            std::cout << "recv() Failed\n";
        }
        else {
            std::cout << "recv() data from server:" << buf << std::endl;
        }
    }
}

//Server.h
#pragma once

#include <Winsock2.h>
#include <string>

class Server
{
public:
    Server(SOCKET s);
    ~Server();

    //欢迎函数
    bool welcome();
    //服务端运行函数
    void running();
    //命令解析函数
    int commandParse(char* instruck, std::string &paramter);
    //文件接收函数
    bool receiveFile(std::string filename);
    //文件发送
    bool sendFile(std::string filename);

private:
    SOCKET server;
    int maxLen;
    char buf[1024];
};

//Server.cpp
#include "Server.h"
#include "Tool.h"

#include <iostream>
#include <vector>

Server::Server(SOCKET s)
    :server(s)
{
    maxLen = 1024;
}


Server::~Server()
{
}

bool Server::welcome()
{
    char welcome[1024] = "Welcome, my friend\n";

    //发送信息给客户端
    int iSend = send(server, welcome, sizeof(welcome), 0);
    if (iSend == SOCKET_ERROR) {
        std::cout << "send() Failed\n";
        return false;
    }

    return true;
}

void Server::running()
{
    welcome();

    while (true) {
        if (recv(server, buf, maxLen, 0) == 0) {
            std::cout << "recv() Faied!\n";
        }

        std::string paramter;
        int cmd = commandParse(buf, paramter);

        switch (cmd) {
        case 0:
            std::cout << "Command is invalid\n";
            break;

        case 1:
            std::cout << "Start receive the file from client.\n";
            receiveFile(paramter);
            break;

        case 2:
            std::cout << "Start send file to client.\n";
            sendFile(paramter);
            break;

        default:
            std::cout << "Command is invalid\n";
        }
    }
}

int Server::commandParse(char* instruck, std::string &paramter)
{
    std::string string(buf);
    std::cout << string;
    std::vector<std::string> command;
    Tool::splitString(string, command, std::string(" "));
    //std::cout << command[0] << " " << command[1] << std::endl;

    if (command.size() != 2) {
        paramter = "";
        return -1;
    }

    if (command[0] == "STOR") {
        paramter = command[1];
        return 1;
    }
    if (command[0] == "RETR") {
        paramter = command[1];
        return 2;
    }

    return -1;
}

bool Server::receiveFile(std::string filename)
{
    return false;
}

bool Server::sendFile(std::string filename)
{
    return false;
}
工具类(字符分割方法,服务端与客户端完全一样)
//Tool.h
#pragma once
#include <string>
#include <vector>

class Tool
{
public:
    Tool();
    ~Tool();

    //字符串分割函数
    static void splitString(const std::string &input, std::vector<std::string> &output, std::string &delim);
};

//Tool.cpp
#include "Tool.h"

#include <sstream>
#include <istream>


Tool::Tool()
{
}


Tool::~Tool()
{
}

void Tool::splitString(const std::string & input, std::vector<std::string>& output, std::string &delim)
{
    std::string::size_type pos1, pos2;
    pos1 = 0;
    pos2 = input.find(delim);

    while (std::string::npos != pos2)
    {
        output.push_back(input.substr(pos1, pos2 - pos1));

        pos1 = pos2 + delim.size();
        pos2 = input.find(delim, pos1);
    }
    if (pos1 != input.length())
        output.push_back(input.substr(pos1));
}
源代码地址

https://github.com/lw1243925457/FTP

【Ensp】FTP服务器设置和FTP解析 大部分的多媒体多媒体应用协议,如SIP,FTP,NetMeeting协议等,使用约定的固定端口来初始化一个控制连接,再动态地选择端口用于数据传输,并且这些端口选择是不可预测的。在防火墙设置时,可以通过ASPF(应用层报文过滤)中的Server Map表来满足多通道协议的正常工作,它正常检测应用层报文信息,并动态地根据报文内容创建和删除临时的Server Map表项,以允许其它非约定端口通过防火墙。(5)我们可以在路由器或能访问ftp服务器的设备上,通过cli命令行的方式来访问ftp服务器。 阅读详情

相关推荐

ftp服务器的搭建及windows ftp客户端的连接,域名解析到ftp目录过程

最近入手了一台阿里云服务器,学习了一下如何搭建ftp服务器及配置,以及在windows本地用ftp客户端工具进行连接操作,域名解析到ftp目录,在这儿分享下。 工具及环境: 服务器版本为centos7.4 预先下载好ftp客户端(比如flashFXP),远程登录操作工具(比如xshell),自行百度下载,具体下载后的连接操作不说了,有点注意,连接时的ip是服务器的公网ip 搭建ftp服务器...

会飞的鱼的博客 1万+

FTP命令列表

命令 描述 ABOR (ABORT)此命令使服务器终止前一个FTP服务命令以及任何相关数据传输。 ACCT (ACCOUNT)此命令的参数部分使用一个Telnet字符串来指明用户的账户。 ADAT (AUTHENTICATION/SECURITY DATA)认证/安全数据 ALLO 为接收一个文件分配足够的磁盘空间 APPE 增加

薄荷的专栏 9462

【自己编写的简单FTP客户端(附服务端)】

自己用MFC 编写的FTP客户端 (附带FTP服务端)

网络服务之----FTP服务

前言:前面玩了DHCP和DNS,今天在和拐友们玩玩FTP服务,FTP 是因特网网络上历史最悠久的网络工具,从 1971 年由 A KBHUSHAN 提出第一个 FTP 的RFC(RFC114) 至今近半个世纪来,FTP 凭借其独特的优势一直都是因特网中最重要、最广泛的服务之一。 一.FTP的概述 FTP(File TransferProtocol,文件传输协议)是典型的C/S架构的应用层协议,需要由服务端软件、客户端软件两个部分共同实现文件传输功能。FTP客户端和服务器之间的连接是可靠的,面向连

weixin_67474417的博客 2600

YOLOv8工业级增强实战:小目标检测与HDR鲁棒性优化

YOLO(You Only Look Once)作为主流实时目标检测框架,其核心价值在于模块化架构与工程可扩展性。理解YOLOv8的Anchor-Free设计、C2f特征融合机制及Detect头部解耦原理,是实现性能突破的基础。在工业落地中,真实瓶颈往往不是模型版本迭代,而是小目标漏检、高动态范围(HDR)场景适应差、密集遮挡ID断裂等具体问题。通过配置层动态多尺度训练、物理感知数据增强、Neck跨尺度注意力注入、质量感知损失函数升级等七层增强策略,可在不更换主干的前提下显著提升mAP与边缘设备推理效率。本

weixin_32667439的博客 258

汇总药用数据库(Pubchem,bingdingDB,Chembl,ExcapeDB)数据

记载一下如何汇总4大数据库的数据

recher_He1107的博客 3391

自己写一个FTP客户端程序的过程

本文介绍了自己编写一个FTP客户端源码的过程,包括怎样入手,理清FTP命令,最后编码的过程。这是以前在项目中用过的一个实例,现在总结了一下,也可以看看在项目中遇到问题,解决问题的经过。

tomcoding的博客 1708

CarPlay无线连接背后的‘握手’秘密:深入解读iAP2协议与蓝牙/Wi-Fi协同

本文深入解析了CarPlay无线连接背后的技术细节,重点探讨了iAP2协议与蓝牙/Wi-Fi的协同工作原理。从蓝牙层的UUID识别到iAP2协议的握手过程,再到Wi-Fi热点的建立与优化,详细揭示了CarPlay无线连接的安全机制和调试方法,为开发者提供了实用的技术参考。

weixin_42520573的博客 474

教你写一个ftp协议(文件传输协议)

一、FTP协议简介 FTP 是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为“文传协议”。用于Internet上的控制文件的双向传输。同时,它也是一个应用程序(Application)。基于不同的操作系统有不同的FTP应用程序,而所有这些应用程序都遵守同一种协议以传输文件。在FTP的使用当中,用户经常遇到两个概念:”下载”(Download)和”上传”(Up...

weixin_42898819的博客 1万+

旋转变压器软件解码simulink仿真

旋转变压器软件解码simulink仿真、电机转速位置测量

qq_31446727的博客 2580

保姆级教程:STM32CubeMX配置PWM死区与刹车功能,防止电机驱动炸管

本文详细解析了使用STM32CubeMX配置PWM死区与刹车功能的完整流程,帮助工程师避免电机驱动中的炸管风险。通过深入讲解死区时间计算公式、CubeMX配置界面及刹车功能的安全机制,结合实际电路设计要点和调试技巧,为电机驱动和电源转换应用提供可靠解决方案。

weixin_42550597的博客 344

FTP协议编程看这一篇文章就够了

1、FTP 概述 文件传输协议(FTP)作为网络共享文件的传输协议,在网络设备中具有广泛的应用,FTP协议用于实现网络中不同设备之间的文件传输与共享,这个是一个网络协议与具体的操作系统无关,只要你所使用的操作系统支持此协议就可以进行文件传输。 FTP协议中的设备分为客户端和服务器2种角色,在传输文件时,FTP 客户端程序先与服务器建立连接,然后向服务器发送命令。服务器收到...

fhqlongteng的博客 4589

基于ZYNQ7020芯片(黑金开发板AX7020)之AXI-FULL DDR的PL与PS交互操作。

在该工程中我们使用了PS端的串口接收功能,PS端串口接收和发送分别有一个64字节的FIFO,但是因为串口接收阈值设置为16,所以固定接收16个字节数据后才会发生中断。此测试工程得到以前知识的总结和各大网友的支持,只希望可以为学习的你更进一步,大家一起学习才是真的开心。加油,国产芯片之路。

landyjzlai的博客 3189

Linux FTP命令全集(ftp指令)

参考文章:Linux FTP 命令全集

Dontla的博客 8096

ISP图像处理Verilog仿真框架搭建(附代码)

基于Verilog的图像处理仿真框架搭建

路漫漫其修远兮,吾将上下而求索 1894

uniapp(全端兼容) - 最新实现全局设置修改字体大小功能,统一修改全部页面所有文字的大小(标准/小/中/大字号切换,用户修改后整个项目立即生效)设置应用字体的大小(详细示例代码,一键复制开箱即用

uni-app,支付宝微信小程序,h5,手机端H5网页,移动端网站,安卓app,ios苹果app,nvue,全局设置字体大小,退出后还能记录字号大小,uniApp将全部页面的字体字号进行修改,uniapp设置改变全局字体大小功能,动态调整应用字体大小,详细教程,动态显示字体大小,可调整显示字体大小,如何解决不同端字体大小的问题,除了rem还有什么方法,设置全局字体大小,用户设置字号大小,应用字体大中小,实现用户全局设置应用字体大小,老年模式字体设置思路,h5端不行怎么办,移动端不生效,修改全局字号,一键改整

✅ 精选推荐文章 8884

FTP命令最全解释,从此再也不用学习ftp命令了

一、ftp的get命令和mget命令有何不同? get一次只下载一个文件;mget一次可以下载多个文件,而且支持通配符,需要注意的是在mget的时侯,需要对每一个文件都选择y/n,如果想不交互的下载全部的文件,可以先用prompt命令关掉交互方式(关闭:prompt off;打开:prompt on)。 二、FTP使用什么命令来定位服务器与本地硬盘的路径? ftp中用lcd切换本地路径,用c...

Bamboo 1万+

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

FTP命令解析-帮助你更快凌驾FTP文件系统

这些命令涵盖了FTP客户端的主要功能,包括连接、文件传输、目录管理、传输模式切换、服务器状态查看和调试等。根据具体需求,你可以灵活使用这些命令来完成文件上传、下载

星海幻影的博客 1738

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

ftp 命令与服务

随着互联网和网络技术的发展,FTP 服务器也不断演变。FTP 服务器的发展从简单的文件传输协议,逐步演变为支持加密、用户认证、多协议支持的现代化工具。​: 设置 FTP 服务器允许的最大并发连接数,以及每个 IP 地址允许的最大连接数。通过 FTP 客户端(如 FileZilla、WinSCP 等)使用主机 IP 地址、用户名和密码连接到 FTP 服务器。​: 设置 FTP 服务器监听的端口,默认是 21。如果使用防火墙,确保允许 FTP 服务器的相关端口(默认情况下,FTP 使用 TCP 端口 21)。

qq_38641599的博客 1978

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

ftp 命令 解析

[1]linux下ftp命令参数详解 FTP>ascii: 设定以ASCII方式传送文件(缺省值) FTP>bell: 每完成一次文件传送,报警提示. FTP>binary: 设定以二进制方式传送文件. FTP>bye: 终止主机FTP进程,并退出FTP管理方式. FTP>case: 当为ON时,用MGET命令拷贝的文件名到本地机器中,全部转换为小写字母. FTP>cd: 同UNIX的CD命令. FTP>cdup: 返回上一级目录. FTP>chmod...

明天乌儿会歌唱 1512

FTP协议解析之Wireshark报文分析

FTP是客户端-服务器协议,客户端将请求文件,而本地或远程服务器将提供该文件。我们熟知的FTP客户端:WinSCP、WS FTP、FileZilla等都是使用文件传输协议,它是一种标准的Internet 协议。用于通过TCP / IP 连接在Internet上的计算机之间传输文件 。 文件传输协议如何工作? FTP是客户端-服务器协议,它依赖于客户端和服务器之间的两个通信通道。一个用于控制对话的命令通道和一个用于传输文件内容的数据通道。客户端通过请求下载文件来启动与服务器的对话。 客户端可以使用FTP上传、

chen1415886044的博客 1万+

windows下的FTP命令

假设要连接的FTP信息如下: FTP Server: FtpTest User: tester Password: 123123 打开Windows的开始菜单,执行“运行”命令,在对话框中输入ftp,按下“确定”按钮将会切换至DOS窗口,出现命令提示符 ftp> 键入命令连接FTP服务器: ftp> open FtpTest (回车) 稍等片刻,屏幕提示连接成功:

u012467492的专栏 3万+

linux下ftp命令打印日志,ftp服务器日志解析

FTP服务器日志解析FTP是老牌的文件传输协议,在网络中应用非常广泛。本节就Vsftp服务器的日志进行重点讨论,在本书的FTP多级跳案例中就会涉及到本节学到的知识。在Redhat Linux系统下Vsftp的配置文件在/etc/vsftp/vsftp.conf文件中。默认情况下,Vsftp不单独记录日志,也就是说不会输出到一个单独的文件中存储,而是统一存放到/var/log/messages文件中...

weixin_36378669的博客 7623

ftp的命令

一、ftp的get命令和mget命令有何不同? get一次只下载一个文件;mget一次可以下载多个文件,而且支持通配符,需要注意的是在mget的时侯,需要对每一个文件都选择y/n,如果想不交互的下载全部的文件,可以先用prompt命令关掉交互方式(关闭:prompt off;打开:prompt on)。 二、FTP使用什么命令来定位服务器与本地硬盘的路径? ftp中用lcd切换本地路径,用cd切换...

qq_39110709的博客 483

FTP命令:LIST

LIST命令用于列出指定目录中的子目录和文件信息,如果没有指定目录的名字就默认列出当前目录下的所有子目录和文件信息并返回给客户端。--如果路径名指定的是一个目录名,服务器会发送一份指定目录中的子目录和文件列表信息--如果路径名指定的是一个文件,服务器会发送该文件的相关信息最近用VS2005编写FTP客户端程序时,发现一个问题:不同的FTP服务器对LIST命令的响应文件信息列表的格式不一样。这样的话,客户端在对返回的文件信息列表进行处理时,要首先判断格式喽。RFC-959里面关于LIST是这样说的:这里应该说

yhtppp的专栏 1万+

Linux ftp 命令

一、ftp的get命令和mget命令有何不同? get一次只下载一个文件;mget一次可以下载多个文件,而且支持通配符,需要注意的是在mget的时侯,需要对每一个文件都选择y/n,如果想不交互的下载全部的文件,可以先用prompt命令关掉交互方式(关闭:prompt off;打开:prompt on)。 二、FTP使用什么命令来定位服务器与本地硬盘的路径? ftp中用lcd切换本地路径,用c...

shengerjianku的专栏 212
上一篇: FTP 编写 3:同时为多个客户端服务(多线程)
下一篇: FTP 编程 5 文件传输与目录切换
_萧_
博客等级 码龄10年 55粉丝 157原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值