FTP Client mit Winsock



  • Hallo!

    Habe mal versucht einen FTP Clienten mit Sockets zu programmieren.
    Mein Code sieht folgendermaßen aus:

    #include <cstdlib>
    #include <iostream>
    #include <winsock.h>
    #include <winsock2.h>
    #include <windows.h>
    
    using namespace std;
    
    int gPort = 21;
    int error = 0;
    string msg = "ftp";
    string msp = "mymail@thisurl.de";
    string dir = "dir";
    
    int main(int)
    {
           SOCKET lhSocket;
           SOCKADDR_IN lSockAddr;
           WSADATA wsaData;
           int lConnect;
           int lLength;
           char lData[]="SendData";
           if(WSAStartup(MAKEWORD(2,0),&wsaData) != 0)
           {
                cout<<"Socket Initialization Error. Program aborted\n";
                cin>>error;
                return 0;
            }
           lhSocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
           if(lhSocket == INVALID_SOCKET)
           {
                cout<<"Invalid Socket "<<GetLastError()<<". Program Aborted\n"<<endl;
                cin>>error;
            }
           memset(&lSockAddr,0, sizeof(lSockAddr));
           lSockAddr.sin_family = AF_INET;
           lSockAddr.sin_port = htons(gPort);
           lSockAddr.sin_addr.s_addr = inet_addr("193.170.42.50");
           lConnect = connect(lhSocket,(SOCKADDR *)&lSockAddr,sizeof(SOCKADDR_IN));
           if(lConnect != 0)
           {
                 cout<<"Connect Error. Program aborted\n";
                 cin>>error;
                 return 0;
            }
    
           send(lhSocket,msg.c_str(),strlen(msg.c_str()),0);
           Sleep(2000);
           send(lhSocket,msp.c_str(),strlen(msp.c_str()),0); 
           //hier sollte jetzt von dem Server eine Bestätigung des erfolgreichen
           //Logins kommen, daher müssen wir die Nachricht einlesen
          char temp[512];
          while (true)
           {
    
                 int bytes = recv(lhSocket,temp,sizeof(temp)-1,0);
                 temp[bytes] = '\0';
                 cout<<temp;   
                 send(lhSocket, dir.c_str(), strlen(dir.c_str()), 0);   
           }
    
           closesocket(lhSocket);
           return 0;
    
    }
    

    Führe ich den Code so aus, so scheint nichts zu passieren. Wenn ich aber die Zeile

    send(lhSocket, dir.c_str(), strlen(dir.c_str()), 0);
    

    weglasse, bekomme ich folgende Meldung angezeigt (vom FTP Server)

    220 Serv-U FTP Server v6.2 for WinSock ready...

    Irgendwie scheint es mir, dass ich nicht eingeloggt bin bzw. keine Befehle absenden kann. Was mache ich falsch, bzw. wo liegt mein Fehler?

    Hoffe, dass mir jemand helfen kann, da ich heute schon 4h probiert habe den Fehler zu finden aber nicht fündig wurde.

    Danke schonmals für eure Hilfe
    lg thomas



  • Dieser Thread wurde von Moderator/in evilissimo aus dem Forum C++ in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • nach dem connect() schickt der FTP-Server dir erstmal den Banner ("220 Serv-U FTP Se..."), du solltest die Antwort vom FTP-Server einlesen und ihm nicht einfach wild irgendwelche Nachrichten schicken 😉

    Und aufgepasst bei recv()!!!
    recv() füllt NICHT zwingend den kompletten Buffer!
    Du solltest recv() aufrufen bis du den EndOfLine-Marker bekommen hast, sonst kann es dir passieren dass du nur die halbe Antwort eingelesen hast und den Server schon wieder was schickst!

    Ansonsten noch ein Tipp (hier wird einiges bezügl. des ftp-protokolls ganz gut erklärt):
    http://cr.yp.to/ftp.html


Anmelden zum Antworten