Datei senden an ftp-server mit sockets in C

Ich versuche, eine Datei hochzuladen auf mein ftp-server mit sockets. Es verbindet sich mit dem server und liest die Verzeichnisse, aber nicht die Datei hochladen. "STOR" - Befehl erstellt eine Datei in dem server mit einem leeren Inhalt. Warum bin ich immer "Keine Datenverbindung" - Antwort vom server und meine Datei ist leer?

#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <arpa/inet.h>

int main(int argc, char *argv[])
{
    argv[0]="2";
    argv[1]="ip";

    int sockfd = 0, n = 0;
    char recvBuff[1024];
    struct sockaddr_in serv_addr;
    char mesUser[100]="USER ftpuser\n";
    char mesPass[100]="PASS pass\n";
    char meStor[100]="STOR xx\n";
    char mesPasv[100]="PASV\n";
    char meAppe[100]="APPE xx\n";

    argc=2;

    if(argc != 2)
    {
        printf("\n Usage: %s <ip of server> \n",argv[0]);
        return 1;
    }

    memset(recvBuff, '0',sizeof(recvBuff));
    if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
    {
        printf("\n Error : Could not create socket \n");
        return 1;
    }

    memset(&serv_addr, '0', sizeof(serv_addr));

    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port = htons(21);

    if(inet_pton(AF_INET, argv[1], &serv_addr.sin_addr)<=0)
     {
     printf("\n inet_pton error occured\n");
     return 1;
     }


    //serv_addr.sin_addr.s_addr = inet_addr(argv[1]);

    if( connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0)
    {
        printf("\n Error : Connect Failed \n");
        return 1;
    }

    if( send(sockfd , mesUser , strlen(mesUser) , 0) < 0)
    {
        perror("send failed");
        return 1;
    }

    if( send(sockfd , mesPass , strlen(mesPass) , 0) < 0)
    {
        perror("send failed");
        return 1;
    }

    char* fr_name = "pic.jpg";
    FILE *fr = fopen(fr_name, "r");
    if(fr == NULL){
        printf("File cannot be opened");
        return 0;
    }
    else{

        /*if( send(sockfd , mesPasv , strlen(mesPasv) , 0) < 0)
        {
            perror("send failed");
            return 1;
        }*/

        if( send(sockfd , meStor , strlen(meStor) , 0) < 0)
        {
            perror("send failed");
            return 1;
        }



        char buffer[100];
        fscanf(fr,"%s",buffer);
        write(sockfd,buffer,100);


        if( send(sockfd , meAppe , strlen(meAppe) , 0) < 0)
        {
            perror("send failed");
            return 1;
        }
        //close(sockfd);


    }

    /*if( send(sockfd , meStor , strlen(meStor) , 0) < 0)
    {
        perror("send failed");
        return 1;
    }
    */

    while ( (n = read(sockfd, recvBuff, sizeof(recvBuff)-1)) > 0)
    {
        recvBuff[n] = 0;
        if(fputs(recvBuff, stdout) == EOF)
        {
            printf("\n Error : Fputs error\n");
            return 0;
        }
    }

    if(n < 0)
    {
        printf("\n Read error \n");
        return 0;
    } 

    return 0;
}

Ausgabe:

 220---------- Welcome to Pure-FTPd [privsep] [TLS] ----------
220-You are user number 6 of 50 allowed.
220-Local time is now 14:41. Server port: 21.
220 You will be disconnected after 15 minutes of inactivity.
331 User username OK. Password required
230 OK. Current restricted directory is /
425 No data connection
425 No data connection
  • Senden Sie das APPE Befehl Anhängen, um eine Datei auf der server-Seite, aber Sie machen Sie nicht eine Daten-Verbindung zum senden der aktuellen Datei und weder zu initiieren aktiv-Modus Daten übertragen. Was erwartest du, was passiert?
  • Außerdem müssen Sie nicht befolgen Sie die Protokoll-Spezifikation, die von request-response-Typ. Senden Sie eine Anfrage (Befehl), und der server antwortet mit einer Antwort. Sie senden alle Ihrem Befehl ohne zu wissen, ob der server Sie akzeptiert oder nicht, dann am Ende Sie alle Lesen, dass die übertragenen Daten vom server, um Sie am Ende. Sie müssen Lesen Sie mehr über FTP, einschließlich Ihrer entsprechenden RFC-Dokumenten.
  • Wie kann ich eine Daten-Verbindung zu senden Sie die Datei über sockets? Können Sie mir sagen, welche Funktionen ich verwenden soll, oder empfehlen Sie mir eine Quelle oder ein Beispiel zeigen? Ich bin neu in C.
  • FYI, Ihre memset() Funktionen nicht null Ihre Puffer aus, sondern füllen Sie mit der ASCII-Darstellung der '0', d.h. 0x30. Besser ersetzen Sie es mit 0.
  • In der Tat brauchen Sie nicht memset() fordert auf, alles in korrekt geschriebenen Netzwerk-code, ein anderer als null-Adress-Strukturen vor bind() oder connect().
InformationsquelleAutor amone | 2015-04-01
Schreibe einen Kommentar