2011-04-21 20 views
0

私は、テキストファイルを取得して保存できる非常に単純なFTPサーバープログラムを実装しています。私の質問は、FTPクライアントの要求が次の "RETR test.txt"のファイルを言うと、サーバーはどのようにこのファイルを送信しますか?そのテキストファイルを開いて内容をバッファにコピーし、それを単に送信するか、それともそれ以上にあるのですか?私はこれを実装する方法がわからない、誰かが基本的なアイデアを明確にすることができますか?FTPでRETRコマンドを実行すると、サーバーはどのようにファイルをクライアントに送信しますか?

編集::

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を開きます。しかし、これによりサーバーが切断されます。

答えて

1

一つバグがあなたが送信する前に、intial返信を送った後、クライアントのコマンド接続を切断するclosesocket(ns)を呼び出しているということですデータ接続を介してファイルします。

2

送信方法は問われません。一度に1バイトずつ読み込み、各バイトに対してSendを呼び出します。または、8192バイトのバッファを作成し、それを一度に送信することもできます。またはその他のバイト数。

何が問題であり、FTPサーバは、アクティブまたはパッシブモードである場合:あなたのコード内http://slacksite.com/other/ftp.html

+0

こんにちは、サーバーはアクティブモードですが、どうすればそのようなファイルを送信できますか? – silent

+0

申し訳ありませんが、ファイルの1バイトを読む方法がわかりません。 – silent

+0

代わりにオープンソースコンポーネントを購入または使用します。それは安く聞こえる。 – jgauffin