【问题标题】:I'd like to read FTP commands我想阅读 FTP 命令
【发布时间】:2013-01-17 08:39:52
【问题描述】:

我已经编写了从客户那里读取简单文本的程序。 该程序在 telnet 发送消息时运行良好,但在 ftp 发送消息时无法运行。 此外,程序误解(?)套接字连接良好。 (见图。) 事实上,ftp 客户端正试图连接我的服务器,随着时间的推移,ftp 客户端 fali 进行连接。我想使用我的服务器程序阅读 ftp 消息。我该怎么办??

服务器程序-

#include <pthread.h>
#include <sys/types.h>
#include <sys/socket.h>

#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>

#include <stdlib.h>
#include <unistd.h>
#include <string.h>

#define MAXLINE 1024
#define PORTNUM 3600

void * thread_func(void *data)
{
    int sockfd = *((int *)data);
    int readn;
    socklen_t addrlen;
    char buf[MAXLINE];
    struct sockaddr_in client_addr;
    memset(buf, 0x00, MAXLINE);
    addrlen = sizeof(client_addr);
    getpeername(sockfd, (struct sockaddr *)&client_addr, &addrlen);

    while((readn = read(sockfd, buf, MAXLINE)) > 0)
    {
        printf("Read Data %s(%d) : %s", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port), buf);
        memset(buf, 0x00, MAXLINE);
    }
    close(sockfd);
    printf("worker thread end\n");
    return 0;
}

int main(int argc, char** argv)
{
    int listen_fd, client_fd;
    socklen_t addrlen;
    int readn;
    char buf[MAXLINE];
    pthread_t thread_id;

    struct sockaddr_in server_addr, client_addr;

    if( (listen_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
        return 1;

    memset((void*)&server_addr, 0x00, sizeof(server_addr));
    server_addr.sin_family = AF_INET;
    server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    server_addr.sin_port = htons(PORTNUM);

    if(bind(listen_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1)
    {
        perror("bind error");
        return 1;
    }
    if(listen(listen_fd, 5) == -1)
    {
        perror("listen error");
        return 1;
    }

    while(1)
    {
        addrlen = sizeof(client_addr);
        client_fd = accept(listen_fd, (struct sockaddr *)&client_addr, &addrlen);
        if(client_fd == -1)
        {
            printf("accept error\n");
            // return -1;
        }
        else
        {
            printf("someone comes in.\n");
            fflush(stdout);
            pthread_create(&thread_id, NULL, thread_func, (void *)&client_fd);
            pthread_detach(thread_id);
        }
    }
    return 0;
}

这里是数字。 https://docs.google.com/document/d/1sKmk0NfTA9dL2svOPsAtaXt_bSpcT4s62yjHuKZCpIk/edit

【问题讨论】:

    标签: sockets ftp


    【解决方案1】:

    FTP 协议稍微复杂一些……不能只等待客户端数据,还必须处理协议的多种情况。

    为了赶上第一阶段,您必须向客户端发送220 command(FTP 横幅,告诉我们的 FTP 服务器是什么,并声明我们已准备好取回用户名)。

    所以,尝试通过连接的套接字发送字符串"220-#\r\nMy FTP SERVER\r\n",看看发生了什么。

    添加,就在read() 调用这些行之前。

    sprintf(buf, "220\r\nMy FTP SERVER\r\n\r\n");
    write(connected_fd, (void *) buf, strlen(buf));
    

    【讨论】:

    • 消息“220-#\r\nMy FTP SERVER\r\n”很好地打印到我的终端。但我想接收 ftp-client 发送的消息。 T.T 你能详细告诉我多个案例吗?网站等。
    • 哇,我明白了。我所要做的就是发送与标准 ftp 服务器发送到 FTP 客户端相同的代码消息。
    • 字符串已更新...我已经对其进行了测试并且可以正常工作...它将客户端移动到USER阶段
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-05
    • 1970-01-01
    相关资源
    最近更新 更多