关于c语言实现ftp协议的信息

今天给各位分享c语言实现ftp协议的知识,其中也会对进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

1、在linux中如何用C语言实现FTP上传?2、请教用C语言编的借助UDP协议实现的文件传输的程序3、Linux下用C语言写一个FTP系统程序,基于客户/服务器模式

在linux中如何用C语言实现FTP上传?

你可以使用库函数啊, 比如libftp或者libcurl(记得支持的)。 具体的用法你可以查阅相关的说明文档。比你自己写一个客户端简单多了。

关于c语言实现ftp协议的信息

请教用C语言编的借助UDP协议实现的文件传输的程序

本程序在 Windows 7 Visual Studio 2015 和 Linux Ubuntu 15.04 GCC 5.11 下均编译运行测试通过。

本程序支持 Windows 和 Linux 之间传送文件,如果要在 Windows 和 Linux 之间传送文件,文件名不能出现中文。

本程序支持无线 WiFi,支持 USB 收发器,但仅支持局域网内传送文件,传送文件需要输入对方的 IP 地址。

本程序包括服务器端和客户端,既可以发送文件又可以接收文件。如果要在同一台机器上测试需要同时打开两个程序。

Windows 下查看本机 IP 地址的命令是:

ipconfig

Linux 下查看本机 IP 地址的命令是:

ifconfig

以下是程序代码:

#includestdio.h

#includestdlib.h

#includestring.h

#includemath.h

#ifdef _MSC_VER

    #includewinsock2.h

    #includewindows.h

    #pragma comment(lib, “ws2_32.lib”)

#else

    #includepthread.h

    #includeunistd.h

    #includesignal.h

    #includesys/socket.h

    #includearpa/inet.h

#endif

// 存放发送接收字符数组大小

#define SIZEA 65501

// 每次发送接收字节数

#define SIZEB 65500

typedef struct sockaddr_in SockAddrIn;

SockAddrIn serverAddr, remoteAddr, clientAddr;

// 端口号

int iServerPort, iClientPort;

// 新建 socket 信息

int iUDP;

// 字符串转整型

int strToInt(char* acStr)

{

    int i, iIndex = 0, iNum = 0, iSize = 0;

    if(acStr[0] == ‘+’ || acStr[0] == ‘-‘)

        iIndex = 1;

    for(iSize=iIndex; ; iSize++)

        if(acStr[iSize]  ‘0’ || acStr[iSize]  ‘9’)

            break;

    for(i=iIndex; iiSize; i++)

        iNum += (int)pow(10, iSize – i – 1) * (acStr[i] – 48);

    if(acStr[0] == ‘-‘)

        iNum = – iNum;

    return iNum;

}

// 整型转字符串

void intToStr(int iInt, char* acStr)

{

    int iIndex = 0, iSize, iNum, iBit, i, j;

    if(iInt  0)

    {

        acStr[0] = ‘-‘;

        iInt = – iInt;

        iIndex = 1;

    }

    for(i=0; ; i++)

        if(iInt  pow(10, i))

            break;

    iSize = i;

    for(i=0; iiSize; i++)

    {

        iNum = pow(10, iSize – i – 1);

        iBit = iInt/iNum;

        iInt -= iNum*iBit;

        acStr[i + iIndex] = iBit + 48;

    }

    if(iSize != 0)

        acStr[iSize + iIndex] = ‘\0’;

    else

    {

        acStr[0] = ‘0’;

        acStr[1] = ‘\0’;

    }

}

void sleepUDP(int iSleep)

{

#ifdef _MSC_VER

    Sleep(iSleep);

#else

    usleep(iSleep*1000);

#endif

}

void openUDP(char* acIpAddr)

{

#ifdef _MSC_VER

    // Winsows 启用 socket

    WSADATA wsadata;

    if(WSAStartup(MAKEWORD(1, 1), wsadata) == SOCKET_ERROR)

    {

        printf(“启用 socket 失败\n”);

        exit(0);

    }

#endif

    // 新建 socket

    if((iUDP = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1)

    {

        printf(“新建 socket 失败\n”);

        exit(0);

    }

    // 清零

    memset(serverAddr, 0, sizeof(serverAddr));

    memset(clientAddr, 0, sizeof(clientAddr));

    // 设置协议 IP 地址及 Port

    serverAddr.sin_family = AF_INET;

    serverAddr.sin_port = htons(iServerPort);

    serverAddr.sin_addr.s_addr = htonl(INADDR_ANY);

    clientAddr.sin_family = AF_INET;

    clientAddr.sin_port = htons(iClientPort);

    clientAddr.sin_addr.s_addr = inet_addr(acIpAddr);

    // 绑定端口,监听端口

    if(bind(iUDP, (struct sockaddr*)serverAddr, sizeof(serverAddr)) == -1)

    {

        printf(“绑定端口失败\n”);

        exit(0);

    }

}

void closeUDP(void)

{

#ifdef _MSC_VER

    // Winsows 关闭 socket

    closesocket(iUDP);

    WSACleanup();

#endif

}

// 要发送的字符串

char acSendStr[SIZEA];

// 接收到的字符串

char acRecvStr[SIZEA];

// 请求信息

char acReq[SIZEA];

// 文件名字符串

char acFileName[SIZEA];

// 文件字节数字符串

char acFileSize[SIZEA];

int iSize, iNameSize;

// 接收文件名

#ifdef _MSC_VER

DWORD WINAPI recvName(LPVOID p)

#else

void* recvName(void* arg)

#endif

{

    int iAddrSize = sizeof(remoteAddr);

    acReq[0] = ‘n’; acReq[1] = ‘a’; acReq[2] = ‘m’; acReq[3] = ‘e’; acReq[4] = ‘\0’;

    acRecvStr[0] = ‘\0’;

    printf(“%s\n”, “正在发送请求信息!”);

    // 发送请求信息

    sendto(iUDP, acReq, strlen(acReq), 0, (struct sockaddr*)clientAddr, sizeof(clientAddr));

    // 每次发送请求信息后等待一段时间

    sleepUDP(10);

    // 接收文件名

    iSize = recvfrom(iUDP, acRecvStr, SIZEB, 0, (struct sockaddr*)remoteAddr, iAddrSize);

    return 0;

}

// 接收文件

void recvFile(char* acDirName, char* acIpAddr)

{

    FILE* pFile = NULL;

    int i, iFileSize, iRecvNum, iAddrSize = sizeof(remoteAddr);

    // 路径文件名

    char acDirAndFileName[SIZEA];

    openUDP(acIpAddr);

    // 接收文件名

    for(;;)

    {

        // 创建线程

        #ifdef _MSC_VER

            HANDLE hThread;

            DWORD threadId;

            hThread = CreateThread(NULL, 0, recvName, 0, 0, threadId);

            // 每次发送后等待一段时间

            sleepUDP(1000);

            // 强制终止线程

            TerminateThread(hThread, 0);

        #else

            pthread_t thread;

            void* thread_arg = (pthread_t)0;

            pthread_create(thread, NULL, recvName, (void*)thread_arg);

            // 每次发送后等待一段时间

            sleepUDP(1000);

            // 强制终止线程

            pthread_cancel(thread);

        #endif

        if(acRecvStr[0] != ‘\0’)

        {

            acRecvStr[iSize] = ‘\0’;

            printf(“文件名为:%s\n”, acRecvStr);

            break;

        }

    }

    acDirAndFileName[0] = ‘\0’;

    strcat(acDirAndFileName, acDirName);

    // 连接路径名和文件名

    strcat(acDirAndFileName, acRecvStr);

    // 如果已经有这个文件了就清空文件内容

    pFile = fopen(acDirAndFileName, “w”);

    fclose(pFile);

    acReq[0] = ‘s’; acReq[1] = ‘i’; acReq[2] = ‘z’; acReq[3] = ‘e’; acReq[4] = ‘\0’;

    // 接收文件字节数

    for(;;)

    {

        // 发送请求信息

        sendto(iUDP, acReq, strlen(acReq) + 1, 0, (struct sockaddr*)clientAddr, sizeof(clientAddr));

        // 每次发送请求信息后等待一段时间

        sleepUDP(10);

        // 接收文件字节数

        acRecvStr[0] = ‘\0’;

        iSize = recvfrom(iUDP, acRecvStr, SIZEB, 0, (struct sockaddr*)remoteAddr, iAddrSize);

        if(acRecvStr[0] != ‘\0’)

        {

            acRecvStr[iSize] = ‘\0’;

            iFileSize = strToInt(acRecvStr);

            printf(“文件字节数为:%d\n”, iFileSize);

            break;

        }

    }

    // 以追加方式写入文件

    pFile = fopen(acDirAndFileName, “ab”);

    // 文件分几次接收

    iRecvNum = iFileSize/SIZEB;

    // 接收文件

    for(i=0; iiRecvNum; i++)

    {

        intToStr(i, acReq);

        for(;;)

        {

            // 发送请求信息

            sendto(iUDP, acReq, strlen(acReq) + 1, 0, (struct sockaddr*)clientAddr, sizeof(clientAddr));

            printf(“%s\t正在接收文件的第 %d 段\n”, acReq, i);

            // 每次发送请求信息后等待一段时间

            sleepUDP(10);

            // 接收一段文件

            iSize = recvfrom(iUDP, acRecvStr, SIZEB, 0, (struct sockaddr*)remoteAddr, iAddrSize);

            if(iSize == SIZEB)

            {

                // 以追加方式写入文件

                fwrite(acRecvStr, sizeof(char), iSize, pFile);

                break;

            }

        }

    }

    // 接收文件剩余字节

    iSize = iFileSize%SIZEB;

    if(iSize  0)

    {

        acReq[0] = ‘l’; acReq[1] = ‘a’; acReq[2] = ‘s’; acReq[3] = ‘t’; acReq[4] = ‘\0’;

        for(;;)

        {

            // 发送请求信息

            sendto(iUDP, acReq, strlen(acReq) + 1, 0, (struct sockaddr*)clientAddr, sizeof(clientAddr));

            // 每次发送请求信息后等待一段时间

            sleepUDP(10);

            // 接收文件剩余字节

            if(recvfrom(iUDP, acRecvStr, iSize, 0, (struct sockaddr*)remoteAddr, iAddrSize) == iSize)

            {

                // 以追加方式写入文件

                fwrite(acRecvStr, sizeof(char), iSize, pFile);

                break;

            }

        }

    }

    printf(“%s\n”, “文件接收完毕!”);

    // 关闭文件

    fclose(pFile);

    // 关闭连接

    closeUDP();

}

// 发送文件名

#ifdef _MSC_VER

DWORD WINAPI sendName(LPVOID p)

#else

void* sendName(void* arg)

#endif

{

    int iAddrSize = sizeof(remoteAddr);

    acRecvStr[0] = ‘\0’;

    // 接收请求

    printf(“%s\n”, “正在接收请求信息!”);

    recvfrom(iUDP, acRecvStr, 5, 0, (struct sockaddr*)remoteAddr, iAddrSize);

    // 每次接收请求信息后等待一段时间

    sleepUDP(10);

    // 如果请求信息正确发送文件名

    if(acRecvStr[0] == ‘n’  acRecvStr[1] == ‘a’  acRecvStr[2] == ‘m’  acRecvStr[3] == ‘e’  acRecvStr[4] == ‘\0’)

        sendto(iUDP, acFileName, iNameSize, 0, (struct sockaddr*)clientAddr, sizeof(clientAddr));

    return 0;

}

// 发送文件

void sendFile(char* acDirAndFileName, char* acIpAddr)

{

    int i, j, iFileSize, iSendNum, iAddrSize = sizeof(remoteAddr);

    FILE* pFile = NULL;

    pFile = fopen(acDirAndFileName, “rb”);

    fseek(pFile, 0, SEEK_END);

    // 文件字节数

    iFileSize = ftell(pFile);

    intToStr(iFileSize, acFileSize);

    //printf(“%s\n”, acDirAndFileName);

    // 获取文件名长度

    iSize = strlen(acDirAndFileName);

    for(i=iSize-1, iNameSize=0; i=0; i–,iNameSize++)

        if(acDirAndFileName[i] == ‘\\’ || acDirAndFileName[i] == ‘/’)

            break;

    //printf(“%d\n”, iNameSize);

    // 截取文件名

    for(i=0; iiNameSize; i++)

        acFileName[i] = acDirAndFileName[iSize – iNameSize + i];

    acFileName[iNameSize] = ‘\0’;

    //printf(“%s\n”, acFileName);

    openUDP(acIpAddr);

    // 发送文件名

    for(;;)

    {

    // 创建线程

    #ifdef _MSC_VER

        HANDLE hThread;

        DWORD threadId;

        hThread = CreateThread(NULL, 0, sendName, 0, 0, threadId);

        // 每次接收请求信息后等待一段时间

        sleepUDP(1000);

        // 强制终止线程

        TerminateThread(hThread, 0);

    #else

        pthread_t thread;

        void* thread_arg = (pthread_t)0;

        pthread_create(thread, NULL, sendName, (void*)thread_arg);

        // 每次接收请求信息后等待一段时间

        sleepUDP(1000);

        // 强制终止线程

        pthread_cancel(thread);

    #endif

        // 如果请求信息正确退出循环

        if(acRecvStr[0] == ‘n’  acRecvStr[1] == ‘a’  acRecvStr[2] == ‘m’  acRecvStr[3] == ‘e’  acRecvStr[4] == ‘\0’)

            break;

    }

    // 发送文件字节数

    for(;;)

    {

        acRecvStr[0] = ‘\0’;

        // 接收请求

        recvfrom(iUDP, acRecvStr, 5, 0, (struct sockaddr*)remoteAddr, iAddrSize);

        // 每次接收请求信息后等待一段时间

        sleepUDP(10);

        // 如果请求信息正确

        if(acRecvStr[0] == ‘s’  acRecvStr[1] == ‘i’  acRecvStr[2] == ‘z’  acRecvStr[3] == ‘e’  acRecvStr[4] == ‘\0’)

        {

            // 发送文件字节数

            sendto(iUDP, acFileSize, strlen(acFileSize), 0, (struct sockaddr*)clientAddr, sizeof(clientAddr));

            break;

        }

    }

    iSendNum = iFileSize/SIZEB;

    // 发送文件

    if(iSendNum  0)

    {

        for(i=0;;i++)

        {

            acRecvStr[0] = ‘\0’;

            // 接收请求

            recvfrom(iUDP, acRecvStr, SIZEB, 0, (struct sockaddr*)remoteAddr, iAddrSize);

            printf(“%s\t正在发送文件的第 %d 段\n”, acRecvStr, i);

            // 每次接收请求信息后等待一段时间

            sleepUDP(10);

            fseek(pFile, strToInt(acRecvStr)*SIZEB, SEEK_SET);

            fread(acSendStr, 1, SIZEB, pFile);

            //printf(“%s\n”, acSendStr);

            // 发送一段文件

            sendto(iUDP, acSendStr, SIZEB, 0, (struct sockaddr*)clientAddr, sizeof(clientAddr));

            if(strToInt(acRecvStr) = iSendNum – 1)

                break;

        }

    }

    // 发送文件剩余字节

    iSize = iFileSize%SIZEB;

    if(iSize  0)

    {

        for(;;)

        {

            acRecvStr[0] = ‘\0’;

            // 接收请求

            recvfrom(iUDP, acRecvStr, 5, 0, (struct sockaddr*)remoteAddr, iAddrSize);

            // 每次接收请求信息后等待一段时间

            sleepUDP(10);

            // 如果请求信息正确

            if(acRecvStr[0] == ‘l’  acRecvStr[1] == ‘a’  acRecvStr[2] == ‘s’  acRecvStr[3] == ‘t’  acRecvStr[4] == ‘\0’)

            {

                fseek(pFile, iSendNum*SIZEB, SEEK_SET);

                fread(acSendStr, 1, iSize, pFile);

                //printf(“%s\n”, acSendStr);

                // 发送文件剩余字节

                sendto(iUDP, acSendStr, iSize, 0, (struct sockaddr*)clientAddr, sizeof(clientAddr));

                break;

            }

        }

    }

    printf(“%s\n”, “文件发送完毕!”);

    // 关闭连接

    closeUDP();

}

int main(void)

{

    char acDirName[SIZEA];

    char acDirAndFileName[SIZEA];

    char acIpAddr[15];

    int i, iOption = 0, iSize = 0;

    FILE* pFile = NULL;

    char cLast = ‘\\’;

option:

    printf(“%s\n”, “****************************************************\n本程序包括服务器端和客户端,既可以发送文件又可以接收文件。\n支持无线 WiFi,支持 USB 收发器,但仅支持局域网内传送文件。\n如果要在 Windows 和 Linux 之间传送文件,文件名不能出现中文。\n如果要在同一台机器上测试需要同时打开两个程序。\n****************************************************”);

    printf(“%s\n”, “请输入选项,1.发送文件、2.接收文件。”);

    scanf(“%d”, iOption);

    // 发送文件

    if(iOption == 1)

    {

        iServerPort = 1025;

        iClientPort = 1024;

    fileName:

        printf(“%s\n”, “请输入需要发送的路径文件名。\nWindows 路径文件名格式:\t\tC:\\install.txt\nLinux 路径文件名格式:\t\t/home/install.txt”);

        scanf(“%s”, acDirAndFileName);

        pFile = fopen(acDirAndFileName, “rb”);

        if(pFile == NULL)

        {

            printf(“%s\n”, “读取文件失败,请重新输入文件名。”);

            goto fileName;

        }

        // 关闭文件

        fclose(pFile);

        printf(“%s\n”, “请输入接收文件方的 IP 地址,不能有空格。\n例如:\n192.168.1.104”);

        scanf(“%s”, acIpAddr);

        sendFile(acDirAndFileName, acIpAddr);

    }

    // 接收文件

    else if(iOption == 2)

    {

        iServerPort = 1024;

        iClientPort = 1025;

    dirName:

        printf(“%s\n”, “请输入保存文件的路径名。\nWindows 路径名格式:\t\tC:\\img\\\nLinux 路径名格式:\t\t/home/”);

        scanf(“%s”, acDirName);

        iSize = strlen(acDirName);

        // 检查是不是 Linux 路径名

        for(i=0; iiSize; i++)

        {

            if(acDirName[i] == ‘/’)

            {

                cLast = ‘/’;

                break;

            }

        }

        // 检查路径名最后一个字符是不是 \ 或 /

        if(acDirName[iSize – 1] != cLast)

        {

            acDirName[iSize] = cLast;

            acDirName[iSize + 1] = ‘\0’;

        }

        acDirAndFileName[0] = ‘\0’;

        strcat(acDirAndFileName, acDirName);

        strcat(acDirAndFileName, “a.txt”);

        // 试探保存一个无关紧要的文件

        pFile = fopen(acDirAndFileName, “w”);

        if(pFile == NULL)

        {

            printf(“%s\n”, “该路径无法创建文件,请重新输入路径名。”);

            goto dirName;

        }

        else

        {

            // 关闭文件

            fclose(pFile);

            // 删除文件

            remove(acDirAndFileName);

        }

        printf(“%s\n”, “请输入发送文件方的 IP 地址,不能有空格。\n例如:\n192.168.2.249”);

        scanf(“%s”, acIpAddr);

        recvFile(acDirName, acIpAddr);

    }

    else

    {

        printf(“%s\n”, “没有这个选项,请重新输入。”);

        goto option;

    }

    return 0;

}

Linux下用C语言写一个FTP系统程序,基于客户/服务器模式

在绝大多数的LINUX发行版本中都选用的是WashingtonUniversity

FTP,它是一个著名的FTP服务器软件,一般简称为wu-ftp。它功能强大,能够很好地运行于众多的UNIX操作系统,例如:IBM

AIX、FreeBSD、HP-UX、NeXTstep、Dynix、SunOS、Solaris等。所以Internet上的FTP服务器,一大半以上采用了它。wu-ftp拥有许多强大的功能,很适于吞吐量较大的FTP服务器的管理要求:

 1) 可以在用户下载文件的同时对文件做自动的压缩或解压缩操作;

 2)

可以对不同网络上的机器做不同的存取限制;

 3) 可以记录文件上载和下载时间;

 4)

可以显示传输时的相关信息,方便用户及时了解目前的传输动态;

 5) 可以设置最大连接数,提高了效率,有效地控制了负载。

2.2 所需资源

 

 1.2.1

所需包

 RedHat6.2 服务器安装

 1.2.2

所需配置文件

 /etc/ftpusers

 /etc/ftpaccess

 /var/run/

 /etc/ftpconversions

 /var/log/xferlog

 /etc/ftpgroups

 /etc/ftphosts

 1.2.3 相关命令

ftpd FTP服务器程序

ftpshut 用于关闭FTP服务器程序

ftpcount 显示目前在线人数

ftpwho

查看目前FTP服务器的连接情况

ckconfig 检查FTP服务器的设置是否正确

ftprestart

重新启动FTP服务

 1.2.4 相关目录

/home/ftpd/bin

存放一些供FTP用户使用的可执行文件

/home/ftpd/etc

存放一些供FTP用户使用的配置文件

/home/ftpd/pub 存放供下载的信息

/home/ftpd/incoming 存放供上载信息的空间

配置方案

  1.

/etc/ftpaccess

  说明: ftp权限配置文件

  源文件:

 

guestuser weboa

  # FTP用户

  class all real,guest,anonymous 

*

  class weboa guest *

  # 格式:class [类名]

[real/guest/anonymous]

[IP地址]

 功能:

 这个指令的功能设定FTP服务器上用户的类别。并可对客户端的IP地址进行限制,允许某部分的IP地址或全部的IP地址访问。而在FTP

 服务器上的用户基本上可以分为以下三类:

real 在该FTP服务器有合法帐号的用户;

guest 有记录的匿名用户;

anonymous 权限最低的匿名用户

  email root@weboa.com.cn

 

loginfails 5

  # 格式:loginfails [次数]

功能:设定当用户登录到FTP服务器时,允许用户输错密码的次数。

  readme  README*  login

 

readme  README*  cwd=*

  message /welcome.msg 

login

  message .message  cwd=*

#

格式:message [文件名称] [指令]

功能:当用户执行所指定的指令时,系统将指定的文件内容显示出来。

  compress  yes all

# 格式:compress

[yes/no] [类别]

功能:设置哪一个类别的用户可以使用compress(压缩)功能。

  tar

yes all

# 格式:tar [yes/no] [类别]

功能:设置哪一个类别的用户可以使用tar(归档)功能。

  chmod no   

guest,anonymous

# 格式:chmod [yes/no] [real/anonymous/guest]

功能:

  设置是否允许指定用户使用chmod命令更改文件权限。默认是

 

允许。

  delete  yes all

# 格式:delete [yes/no]

[real/anonymous/guest]

  功能:

 

设置是否允许指定用户使用delete命令删除文件。默认是允许。

  overwrite yes  guest

#

格式:overwrite [yes/no] [real/anonymous/guest]

 

功能:设置是否允许指定用户覆盖同名文件。默认是允许。

  rename   yes  guest

# 

格式:rename [yes/no] [real/anonymous/guest]

 

功能:设置是否允许指定用户使用rename命令来为文件改名。默认

  是允许。

  log

transfers anonymous,real inbound,outbound

  # 格式:log transfers

[real/guest/anonymous] [inbound/outbound]

功能:

 设置哪些用户的上载(inbound)和下载(outbound)操作做日志。

  shutdown

/etc/shutmsg

  # 格式:shutdown [文件名]

 

功能:

  FTP服务器关闭的时间可以设置在后面所指定的文件中,当设

 

置的时间一到,便无法登录FTP服务器了,要恢复的话只有将

  这个文件删掉。而这个文件必

须由指令/bin/ftpshut来生成。

  passwd-check rfc822 warn

#

格式:passwd-check [none/trivial/rfc822] [enforce/warn]

功能:设定对匿名用户anonymous的密码使用方式。

  none 表示不做密码验证,任何密码都可以登录;

  trival 表示只要输入的密码中含有字符“@ ” “Times New Roman”‘就可以登录;

  rfc822 表示密码一定要符合RFC822中所规定的E-Mail格式才

 

能登录;

  enfore 表示输入的密码不符合以上指定的格式就不让登录;

warn

表示密码不符合规定时只出现警告信息,仍然能够登录。

  limit remote 32 Any

/etc/ftpd/toomany.msg

  # 格式:limit [类别] [人数] [时间] [文件名]

  功能:这个指令的功能为设置指定的时间内指定的类别允许连接的

 

指定人数上限。当达到上限的时候,显示指定文件的内容。

  upload /home/ftpd * no

 

upload /home/ftpd /pub yes anonymous 0644 dirs

  # 格式:upload [根目录]

[上载目录] [yes/no] [用户] [权限]

  [dirs/nodirs]

 

功能:对可以上载的目录进行更加详细的设置。

  alias incoming

/home/ftp/incoming

  # 格式:alias [目录别名] [目录名]

 

功能:给指定目录设置一个别名,在切换目录时就可以使用较短的

  目录别名。

2.

/etc/ftpusers

说明:FTP用户黑名单,为了安全考虑,需要禁止以下用户使用FTP

源文件:

root

bin

daemon

adm

lp

sync

shutdown

halt

mail

news

uucp

operator

games

nobody

在众多的网络应用中,FTP(File Transfer

porotocol)有着非常重要的地位。在Internet中一个十分重要的资源就是软件资源。而各种各样的软件资源大多数都是放在FTP服务器中的。可以说,FTP与WEB服务几乎占据了整个Internet应用的80%以上。

FTP服务可以根据服务对象的不同分为两类:一类是系统FTP服务器,它只允许系统上的合法用户使用;另一类是匿名FTP服务器,Anonymous

FTP Server,它使用任何人都可以登录到FTP服务器上去获取文件。

如果你在安装LINUX系统的时候,在选择启动进程的时候选择了“ftpd”这一项的话,安装完LINUX系统后,它已经将一个默认的FTP服务器安装到系统中去了。我们已经可以利用它来实现系统FTP服务器的功能了。我们只需在此基础上根据我们的需要进行一些个性化设定就可以了。

关于c语言实现ftp协议和的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

本文来自投稿,不代表【】观点,发布者:【

本文地址: ,如若转载,请注明出处!

举报投诉邮箱:253000106@qq.com

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2024年4月1日 20:28:31
下一篇 2024年4月1日 20:37:01

相关推荐

  • c语言改写模式,c语言实现修改功能

    c语言程序修改? 1、这个程序有4个错误,我都加粗了,第一个是m没有赋初值,第二个是while表达式中的ch=getchar()需要括号括起来,第三个是m=m*10+ch-0中的0也需要用单引号括起来,第四个是第2个while中为m!=0。 2、define容易造成误会,因为不符合一般的编程习惯,false 0, true 1;scanf放在你的那个地方是达…

    2024年5月23日
    3900
  • c语言控制代码的换码序列,c语言交换代码

    求C语言编程大神解答一下下面这个编程代码? k==5,用5去除125余0,所以r=125%5中r为0。由于!0为1,所以执行while循环体:先打印出5(k的值),再n=n/k==125/5=25;由于251则再打印出*号。这一循环结果输出是5*。 下面是我的代码,三个函数分别对应三个问题。 在实现基本要求的前提下,拓展了可以从键盘输入的功能,以下为各题代码…

    2024年5月23日
    5600
  • c语言扫描io脚状态,c语言端口扫描

    求51单片机的上升沿和下降沿C语言检测程序列子,端口就是普通IO口。 上升沿触发是当信号有上升沿时的开关动作,当电位由低变高而触发输出变化的就叫上升沿触发。也就是当测到的信号电位是从低到高也就是上升时就触发,叫做上升沿触发。 单片机怎么计算1s内下降沿的个数的C语言程序或者计算两个下降沿的时间(检测脉冲频率)计算1s内下降沿的个数方法是,一个定时器设置定时1…

    2024年5月23日
    4400
  • c语言mallloc使用的简单介绍

    C语言中使用malloc必须加#includemallo.h? 1、在C语言中使用malloc函数进行动态内存分配。malloc的全称是memory allocation,中文叫动态内存分配。原型:extern void malloc(unsigned int num_bytes);功能:分配长度为num_bytes字节的内存块。 2、你可以看一下C语言那本…

    2024年5月23日
    4400
  • c语言三位小数,C语言三位小数

    怎样用C++语言输出精确到小数点后三位的数? 1、用C++语言输出精确到小数点后三位的数,可以参考下面给出的代码:coutsetiosflags(ios:fixed)setprecision(3)。其中 setiosflags中set是设置的意思。ios是iostream的缩写,即输入输出流。flags是标志的意思。 2、要精确到小数点后若干位,则数据类型为…

    2024年5月23日
    7200
  • c语言21点游戏,二十一点游戏代码c语言

    如何使用C语言编写简单小游戏? 1、数学知识:长方形的面积S=a*b 长方形周长L=2*(a+b)其中a b分别为长方形的宽和高。算法分析:长方形面积及周长均依赖于宽和高,所以先要输入宽高值,然后根据公式计算,输出结果即可。 2、/*也不知道你是什么级别的,我是一个新手,刚接触编程语言,以下是我自己变得一个小程序,在所有c语言的编译器(vc++0、turbo…

    2024年5月23日
    6300
  • c语言当中的null,C语言当中的符号

    C/C++中,NULL和null的区别是什么? nul 和 null要看编译器,不同的编译器有所区别。 所以C或者C++中都使用一个特殊定义NULL表示无效值,其本质就是未定义具体数据类型的0值。 null是是什么都没有的意思。在java中表示空对象。 本意是“空的;元素只有零的”意思。计算机中通常表示空值,无结果,或是空集合。\x0d\x0a在ASCII码…

    2024年5月23日
    4500
  • 包含c语言对txt文件命名的词条

    如何在C语言编程里面修改源文件名字 如果你是在WINDOWS的话,简单了,随便用个编辑器,比如记事本,然后写c源程序,保存到你想要保存的位置。如果你在DOS下,可以用edit,写好以后,按alt键,选择文件菜单,然后保存。 用open打开文件,注意操作模式使用“修改”或者“添加” 用write或者fprintf向文件中写入你的内容。 用close关闭文件。 …

    2024年5月23日
    4800
  • 学c语言编程,学c语言编程用什么软件

    编程开发必须要学C语言吗? 1、要学习。编程开发的学习内容主要包括c语言、python和c+语言。C语言作为一种简单灵活的高级编程语言,它是一个面向过程的语言,一般是作为计算机专业的基础入门语言课程。 2、C语言。对于刚接触编程的人来说,先学习C语言是非常重要的。C语言可以说是是计算机编程语言的鼻祖,其他的编程语言几乎全是由C语言变化衍生出来的。 3、不需要…

    2024年5月23日
    3400
  • c语言用string定义字符串,c语言中用string类型来处理字符串类型

    C++怎样定义定义字符串 1、第一是字符数组来表示字符串。用下面的语句声明:char a[10];C语言中字符数组与字符串的唯一区别是字符串末尾有一个结束符\0,而字符数组不需要。 2、在C中定义字符串有下列几种形式:字符串常量,char数组,char指针 字符串常量 即:位于一对双括号中的任何字符。双引号里的字符加上编译器自动提供的结束标志\0字符,作为 …

    2024年5月23日
    4300

发表回复

登录后才能评论



关注微信