Datei-Browsing über Socketverbindung



  • hallo!

    folgende situation:
    ich habe ein client-java-prog, das mittels einer socket-verbindung mit einem server-c++-prog kommuniziert. nun möchte ich von der client-seite aus einblick in ein vom server bestimmtes verzeichnis erhalten, sowie ggf. dateien aus diesem verzeichnis runterladen.

    kennt da jemand evtl. schon einen ansatz (library, framework, code...), oder muss ich das rad neu erfinden? 😉



  • hallo ich programmiere zurzeit nen Webserver daher hätte ich da ein paar codeschnipsel übrig 😉

    datei senden mit winsock habe ich so realisiert

    void Socket::SendFiles(const char *filename)
    {
     FILE *resource = NULL;
     char buf[1024];
    
     resource = fopen(filename, "r");
     if (resource == NULL)
     {
      printf ( "not_found: %s", filename );
     }
     else
     {
      fgets(buf, sizeof(buf), resource);
      while (!feof(resource))
       {
        send(s_, buf, strlen(buf), 0);
        fgets(buf, sizeof(buf), resource);
       }
     }
     fclose(resource);
    }
    

    dann erstellen eines verzeichnisindex

    std::string showdir(const char *directory,const char *path, std::string body)
    {
            WIN32_FIND_DATA fd;
            HANDLE hfind;
    
            char buf[255];
            char newbuf[255];
            int i;
            int j;
            std::string bodytemp; //soll kurzzeitig die dateiverknüpfungen aufnehmen
    
            strcpy(buf,directory);
    
            i = 0;
            j = 0;
            while( buf[i] != 0 ) // hier werden in der pfadangabe alle vorkommenden / durch \\ ersetzt
             {
               if( buf[i] == '/' )
               {
                 newbuf[j] = '\\';
                 newbuf[j+1] = '\\';
                 j+=2;
               }
               else
               {
                 newbuf[j] = buf[i];
                 j++;
               }
                 i++;
               }
                 newbuf[j] = 0;
                 strcat( newbuf , "*.*" );
    
            hfind = FindFirstFile(newbuf,&fd);
    
    FILETIME local;
      SYSTEMTIME system;
    
            while(hfind != INVALID_HANDLE_VALUE) // hier werden die urls zusammengestellt
            {
              if ((std::string)fd.cFileName != "." && (std::string)fd.cFileName != ".." && (std::string)fd.cFileName != ".htaccess" && (std::string)fd.cFileName != ".htpasswd" && fd.dwFileAttributes != FILE_ATTRIBUTE_HIDDEN)
              {
                printf("Erstellt am %d.%d.%d, dem %d. Tag der Woche, um %d:%d:%d:%d\n",
        (int)system.wDay, (int)system.wMonth, (int)system.wYear, (int)system.wDayOfWeek,
        (int)system.wHour, (int)system.wMinute, (int)system.wSecond, (int)system.wMilliseconds);
    
               if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
                { 
                    sprintf(newbuf,"<TR><TD><A HREF=\"%s%s\">%s</a></TD>\t\t<TD>-</TD><TD> Verzeichniss</TD></TR>\n",path,fd.cFileName,fd.cFileName);
                       body += newbuf;
                }
                else
                { 
                    sprintf(newbuf,"<TR><TD><A HREF=\"%s%s\">%s</a></TD>\t\t<TD>%d</TD><TD> BYTES???</TD></TR>\n",path,fd.cFileName,fd.cFileName,fd.nFileSizeLow);
                       bodytemp += newbuf;
    
                }
              }
                    if(!FindNextFile(hfind,&fd))
                            break;
            }
    
            FindClose(hfind);
    
    body +=bodytemp; // hier werden die dateilinks an die verzeichnislinks angehängt
    
    return body; 
    
    }
    

    daraus baue ich dann den inhalt des html dokuments zusammen
    die funktion erstellte dir nämlich die dateilinks gleich als links

    der zusammenbau ist so erledigt

    else if (isDirectory(r->complpfadfile_.c_str())==TRUE) {
        doctype = "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//DE\">";
        title   = "Index of " + r->path_;
        body    ="<h1>Index of " + r->path_ + "</h1>";
        body   +="<DIV align=\"center\"><TABLE WIDTH=\"100%\"><TR><TH BGCOLOR=\"#CCCCCC\">DateiName</TH><TH BGCOLOR=\"#CCCCCC\">Dateigröße</TH><TH BGCOLOR=\"#CCCCCC\">Dateigröße?</TH></TR><hr>";
        body    = showdir(r->complpfadfile_.c_str(), r->path_.c_str(), body);
        body   +="</TABLE></DIV><hr><br><br><br><br><br><br><br>";
        body   +="<br><hr><CENTER><address>SKIPPSerV/0.0.1 <span>(Windows)</span> Server at <a href=\"/\">skippy.dyndns.ws</a> Port  8080 </address></CENTER>";
        body   +="<br><br><br>";
        body   +="<br>Debuganzeige zeigt den intern verwendeten Pfad an";
        body   +="<br>Der Komplette pfad(pfad+dateiname) war : &gt;" + r->complpfadfile_ + "&lt;"; 
      }
    
    r->answer_  = doctype;
      r->answer_ += "<html><head><title>";
      r->answer_ += title;
      r->answer_ += "</title></head><body bgcolor='" + bgcolor + "'>";
      r->answer_ += body;
      r->answer_ += "</body></html>";
    


  • warum nicht gleich nen ftp deamon auf dem server und ftp client funktionalitäten auf client seite...

    ist doch einfacher - und die libraries gibts bestimmt auch schon



  • @skippy
    danke, aber bei deiner lösung stört mich noch son bisschen das web-basierte. browsen war im übertragenen sinne gemeint, in der java-anwendung halt. aber ich schaus mir morgen mal genau an!

    @pinorrix
    ja so etwas schwebte mir vor, vielleicht kennt ja jemand nützliche libraries für c++/java...



  • das internet ist voll mit c++ opensource ftp-client projects, einfach mal bei

    http://freshmeat.net/projects/dmachine/

    oder

    http://sourceforge.net/

    suchen - da gibts einiges... dann kann man ftp schnell auf die beine stellen

    mit java kenne ich mich nicht so aus - aber da gibts bestimmt auch schon genügend projects.

    ich denke ftp wäre eine gute wahlt...



  • @Skippy:
    wir dein webserver auch https (also SSL verschlüsselung) unterstützen?

    cu



  • Dieser Thread wurde von Moderator/in davie aus dem Forum C++ in das Forum Rund um die Programmierung verschoben.

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

    Dieses Posting wurde automatisch erzeugt.



  • @cplusplus ja wird er auch soll er später durch plugins um jedes beliebige protokoll erweitert werden können z.b. ftp, fasttrack usw.
    eingebaut ist schon ein gästebuch ein forum wird folgen

    @pinorrix dann las es doch einfach weg alles wird in strings verabeitet was du damit machst belibt doch dir überlassen! die funktionen selbst erwarten nur eine
    datei bzw ordner entweder C:\verzeichnis\datei.txt oder htdocs\datei.txt
    fürs datei senden

    und für verzeichnisindex
    C:\verzeichnis\ oder htdocs\

    so cih habe das in meinen server so gemacht

    der server kennt das hauptverzeichnis also C:\server\htdocs oder htdocs\
    du must in java nur noch das unterverzeichnis und eventuell dateinamen übertragen also auch sehr ressourcen schonend und einfacher geht das nicht was du vorhast

    ich weis zwar nicht was du vorhast tippe aber mal darauf das es was einfaches ist wie ein chat mit dateidownload

    und dafür wäre ftp sicher zu aufgebläht und bandbreitenverschwendent
    da du bei ftp das protokoll ja zusätzlich hast auch wenn das durch libs übernommen wird

    sollte dein java client dan auch noch jedes mal zur laufzeit erst von deinem server geladen werden ,müssen die leute dann noch länger warten bis der java client geladen ist.



  • ich habe nicht mehr vor als ich geschrieben hab... man soll in ein verzeichnis schauen können. und selektiv dateien beziehen.
    und der java-client liegt ganz normal auf der client-workstation 😉



  • ich habe rausgefunden, dass es von sun die sun.net.ftp bibliothek gibt um das client-seits ggf. zu bewerkstelligen. leider konnte ich keine api dazu finden, weiss jemand zufällig wo die sich aufhält?


Anmelden zum Antworten