FTP中的RETR命令,服务器如何将文件发送到客户端?

时间:2011-04-21 11:30:34

标签: sockets ftp client-server protocols

我正在实现一个非常简单的FTP服务器程序,它能够检索和存储文本文件。我的问题是,当一个ftp客户端请求说出一个带有以下“RETR test.txt”的文件时,服务器如何发送这个文件?是否打开该文本文件将内容复制到缓冲区并简单地发送它还是有更多内容?我不确定如何实现这一点,有人可以澄清基本想法吗?

修改::

if (strncmp(receive_buffer,"RETR",4)==0)  {
                sprintf(send_buffer,"150 Opening ASCII mode data connection... \r\n");
                printf("<< DEBUG INFO. >>: REPLY sent to CLIENT: %s\n", send_buffer);
                bytes = send(ns, send_buffer, strlen(send_buffer), 0);
                if (bytes < 0) break;
                closesocket(ns);

                char temp_buffer2[80];

                FILE *fin=fopen("test.txt","r");//open test.txt
                while (!feof(fin)){
                    fgets(temp_buffer2,78,fin);
                    sprintf(send_buffer,"%s",temp_buffer2);
                    printf("%s",send_buffer);

                    if (active==0) {
                        printf("***active is 0");
                        send(ns_data, send_buffer, strlen(send_buffer), 0);
                    }
                    else {
                        printf("***active is 1+");
                        send(s_data_act, send_buffer, strlen(send_buffer), 0);
                    }
                }
                fclose(fin);
                sprintf(send_buffer,"226 File transfer complete. \r\n");
                printf("<< DEBUG INFO. >>: REPLY sent to CLIENT: %s\n", send_buffer);
                bytes = send(ns, send_buffer, strlen(send_buffer), 0);
                if (active==0 )closesocket(ns_data);
                else closesocket(s_data_act);
            }

这就是我所做的,对于RETR命令,它打开test.txt尝试发送它。但这会导致服务器断开连接..

2 个答案:

答案 0 :(得分:2)

你发送它并不重要。您可以一次读取一个字节,并为每个字节调用Send。或者你可以创建一个8192字节的缓冲区并一次发送那么多。或任何其他数量的字节。

如果FTP服务器处于主动或被动模式,重要的是:http://slacksite.com/other/ftp.html

答案 1 :(得分:1)

您的代码中的一个错误是您在发送初始回复之前调用closesocket(ns)断开客户端的命令连接,然后通过数据连接发送文件。