Winsock ftp Verbindung erstellen

soeni1987

Mitglied
Ich habe nun seit drei Stunden gesucht und immer noch kein Tutorial oder Beispiel gefunden, wie ich eine ftp Verbindung herstellen kann. Ich habe das Tutorial von cworker durchgearbeitet und soweit fast alles verstanden, jedenfalls hat es funktioniert. Nun möchte ich eine Verbindung zum ftpServer mit Passwort und Benutzername herstellen und eine Textdatei auslesen. den Socket bekomme ich nun dank cworker gestartet aber weiter komme ich nicht. Mein Code bisher:

Code:
#include <windows.h>
#include <winsock2.h>
#include <stdio.h>
 
 
int startWinsock(void)
{
  WSADATA wsa;
  return WSAStartup(MAKEWORD(2,0),&wsa);
}
 
int main()
{
  long rc;
  SOCKET s;
  SOCKADDR_IN addr;
  char buf[256];
 
 
  // Winsock starten
  rc=startWinsock();
  if(rc!=0)
  {
    printf("Fehler: startWinsock, fehler code: %d\n",rc);
    return 1;
  }
  else
  {
    printf("Winsock gestartet!\n");
  }
 
  // Socket erstellen
  s=socket(AF_INET,SOCK_STREAM,0);
  if(s==INVALID_SOCKET)
  {
    printf("Fehler: Der Socket konnte nicht erstellt werden, fehler code: %d\n",WSAGetLastError());
    system ("Pause");
    return 1;
  }
  else
  {
    printf("Socket erstellt!\n");
  }
  //Hier ist der Socket offen
  printf("Verbindung besteht\n");
  //Hier ist der Socket offen
 
  closesocket(s);
  printf("Socket geschlossen\n");
  WSACleanup();
  system ("Pause");
  return 0;
}

Danke im Voraus
 
Hi

FTP ist eine ziemlich komplizierte geschichte...
Willst du wirklich die ganzen Sachen selber ausprogrammieren
Wenn ich mich richtig erinnere,
gibt es für HTTP und FTP schon fertige Funktionen, die alle wichtigen Sachen automatisch machen.
Weis jetzt nicht genau wie die heißt, werd einmal nachschauen,
sonst findet man die sicher beim MSDN
Für so komplexe Protokolle wie FTP wäre das sicher die einfachste Lösung statt alles selber zu machen.

Gruß
 
ich hab bei msdn schon geguckt, aber nichts gefunden.

was meinst du mit funktionen? funktionen, die ich aus einer bibliothek brauche? externe dlls oder was? ich hab gehört, das das recht einfach sein soll.
 
Hat sich was ergeben, kann mir jemand weiter helfen? Im Gruden genommen ist mir egal wie das geht. Ob mit oder ohne Bibliothek, hauptsache kostenloß. Ansonsten gibt es im letzten Kapitel des Petzold (Windows Programmierung) ein beispiel, welches bei mir allerdings nicht geht. Ich hab auch nur den Text der c++ Datei, wenn also jemand den gesammten Surecode hat (also ein Buch mit CD) würde mir auch weiter helfen. bei mir (mit dev c++) kommen nur fehlermeldungen, die ich nicht verstehe. wie:

DWORD hallo;

DWORD first use this function

obwohl dword doch eigentlich bekannt sein müsste aber egal,

also bitte helft mir bei diesem Problem.

Danke

Sönke
 
Nur durch Erstellen eines Socket hast du noch keine Verbindung

printf("Verbindung besteht\n"); stimmt einfach nicht

Bis dahin hast du gerade mal einen Kanal geöffnet über den du eine Verbindung herstellen kannst
Um auf dem Socket eine FTP Verbindung herzustellen müsstest du das ganze FTP Protokoll implementieren,
Schau mal bei MSDN unter Stichwort WinInet, das sollte helfen
 
so nach längerem suchen habe ich folgendes gefunden: ist zwar ohne socket aber egal:
Code:
#include <iostream>
#include <windows.h>
#include <wininet.h>


int main(int argc, char *argv[])
{
    if (argc != 2)
    {
        ::std::cout << "Usage: ftpcmd <host>" << ::std::endl;
        system ("Pause");
        return 0;
    }

    // Initialize WinInet
    HINTERNET hSession = InternetOpen("FtpCmd Utility", 
                                      INTERNET_OPEN_TYPE_PRECONFIG, 
                                      NULL, 
                                      NULL, 
                                      0);

    // Setup connection
    HINTERNET hConnection = InternetConnect(hSession, 
                                            argv[1], 
                                            INTERNET_DEFAULT_FTP_PORT,
                                            NULL,
                                            NULL,
                                            INTERNET_SERVICE_FTP,
                                            0,
                                            0);

    HINTERNET hResponse;  // To be used for the response info
    
    BOOL bRet = FtpCommand(hConnection, // WinInet Connection handle
                           TRUE,        // Yes, I expect a response
                           FTP_TRANSFER_TYPE_ASCII, // I'm receiving ASCII
                           "LIST",      // This is the FTP command I am passing
                           0,           // No context needed
/* der hier ist zu viel*/  &hResponse); // The handle to read the response  

//sowie Fehler Linker error undefindet reference to FtpCommandA obwolm ich die
//Lib wininet eingebunden habe, die eigentlich dafür zuständig sein soll.

    if (!bRet)
    {
        ::std::cout << "FtpCommand failed, error: " << GetLastError() << ::std::endl;
        system ("Pause");
        return 0;
    }

    char buff[4096];
    DWORD dwBytesRead;

    // Read the response
    bRet = InternetReadFile(hResponse, 
                            buff,
                            4095,
                            &dwBytesRead);
    if (!bRet)
    {
        ::std::cout << "InternetReadFile failed, error: " << GetLastError() << ::std::endl;
                system ("Pause");
        return 0;
    }
    // Null terminate response
    buff[dwBytesRead] = 0;

    ::std::cout << "Buffer:\n" << buff << ::std::endl;
            system ("Pause");
}

Fehler Linker error undefindet reference to FtpCommandA obwol ich die
Lib wininet eingebunden habe, die eigentlich dafür zuständig sein soll.

ist es das, was du meinst? der internetexplorer wird doch dazu benötigt oder? ich hab ihn jedenfalls in version 7 da ich den code auch nicht zum ausführen bekomme, weis ich auch nicht, was ich wie verändern kann um ihn für mich zu nutzen.

mein dev c++ meckert außerdem, dass die Funktion FtoCommand zu viele Parameter hat, der letzte ist zuviel.
 
Ja, das ist WinInet
Mit dem linker Error kann ich dir auf Anhieb nicht helfen, ich habe einen anderen Compiler und verwende nur HTTP Server
aber einen Browser braucht man dazu nicht, man kann die Antwort vom Server innerhalb vom Script verarbeiten
 
na ich denke man braucht den browser (laut msdn) um eine bestimmte dll zu haben. weis aber nicht. ansonsten was kann ich denn sonst machen?
 
Zurück