Datei zwichen 2 computer übertragen (Sockets/C++)

d0x

Cadet
Mitglied seit
14.05.2005
Beiträge
30
Renomée
0
hi,
hab mal wieder in problem *duck* :D. Also ich würde gerne eine beliebige Datei über einen Socket übertragen. Ich hab einmal eine Host.cpp und einmal eine Client.cpp geschrieben. Hab gerade den code nochmal neu überarbeitet und die befehle schön kommentiert. Bitte schaut euch das mal an.

client.cpp:
PHP:
#include <fstream.h>
#include <Windows.h>
#include <iostream.h>
#include <conio.h>

/**************
* Client.cpp  *
**************/

/*******************************************************************************
* Funktion um Sockets aufzubauen                                               *
*******************************************************************************/
void StartSock()
{
   WSADATA wsaData;
   if (WSAStartup (MAKEWORD(1, 1), &wsaData) != 0)
   {
      fprintf (stderr, "WSAStartup(): Kann Winsock nicht initialisieren.\n");
      exit (EXIT_FAILURE);
   }
}


/*******************************************************************************
* Socket aufräumen                                                             *
*******************************************************************************/
void EndSock()
{
   WSACleanup();
}


/*******************************************************************************
* Baut an dem übergebenen port eine verbindung auf und gibt die socket         *
* nummr zurück                                                                 *
*******************************************************************************/
int connect(DWORD port)
{
   sockaddr_in serv_addr;

   int sock = socket (AF_INET, SOCK_STREAM, 0);
   serv_addr.sin_family = AF_INET;
   serv_addr.sin_port = htons(31337);
   serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
   if (connect(sock, (sockaddr *) &serv_addr, sizeof(sockaddr)) == -1)
   {
      cout << "geht nicht :( ";
      getch();
   }
   return sock;
}



/*******************************************************************************
*  Diese Funktion durchsucht einen string nach einem teilstring. Geht bestimmt *
*  auch leichter, aber naja, selbst ist der mann *g*                           *
*  gibt bei keinem treffer -1 zurück, sonst die position                       *
*******************************************************************************/
int substrsuche(string feld, string substr)
{
   for(int i=0; i<(signed)(feld.length()-substr.length()); i++)
      if(feld.substr(i, substr.length()) == substr)
         return i;
   return -1;
}



void main()
{
   fstream Quelldatei;               // in diese Datei soll geöffnet und versand werden
   string Quellpfad="c:\\Quell.jpg"; // in diesem pfad ist sie zu finden
   char buffer[100];                 // Diese 100 zeichen werden verschickt

   int sock;                         // socket zum senden



   cout << "Verbindungsaufbau";
   StartSock();
   sock=connect(31337); //für den verbindungsaufbau
   cout << "Verbindung angenommen";

   // öffne die Quelldatei
   Quelldatei.open(Quellpfad.c_str(), ios::in | ios::out | ios::binary);

   // lese die ersten 100 bytes
   Quelldatei.read(buffer,sizeof(buffer));

   // Sollange der Dateizeiger nicht am ende steht, lese weiter aus und sende
   // den Inhalt an den Host
   while(!Quelldatei.eof())
   {
      // Sende 100 Byts
      send (sock, buffer, 100, 0);

      // buffer leeren
      for(int i=0; i<100; i++)
         buffer[i]='\0';

      // Lade neue 100 Byts
      Quelldatei.read(buffer,sizeof(buffer));

   }

   // Sende den letzten Teil des Buffers
   send (sock, buffer, 100, 0);

   // Sende den "<eof>" als zur info für den Host
   send (sock, "<eof>", 5, 0);




   // Datei freigeben
   Quelldatei.close();


   // Sockets schließen
   EndSock();
}

Den passenden hostabschnitt habe ich gerade wegen einem C&P fehler gelöscht.

Ich sag euch trozdem mal wie ich mir es gedacht habe. Anfänglich hatte ich ein programm copy.cpp geschrieben. Dies sah so aus:

PHP:
#include <fstream.h>
void copy()
{
   char buffer[1];
   fstream quell_datei;
   fstream ziel_datei;


   quell_datei.open( "c:\\orginal.jpg", ios::in | ios::out | ios::binary);
   ziel_datei.open( "c:\\kopie.jpg", ios::in | ios::out | ios::binary |ios::trunc);

   cout << "Beginne mit dem kopieren"<< endl;
   while(!quell_datei.eof())
   {
      quell_datei.read(buffer,sizeof(buffer));
      ziel_datei.write(buffer,sizeof(buffer));
   }

   cout << "Fertig...";
}

Es hat einfach ein Byte gelesen und in eine andere Datei geschrieben. Da hab ich mir gedacht, ließt du einfach ein paar mehr bytes aus und schickst die dann über einen socket auf n andern pc. Wenn die datei dann ganz verschickt wurde, sende ein zeichenstring "<eof>" damit der host erkennt das die datei zuende ist.

Leider wollte das ganze nicht so wie ich.

Wenn euch eine besser lösung einfällt, klärt mich bitte auf. Oder wenn ihr oben schon einen fehler findet, warum das nicht klappen kann, klärt mich ebenfalls auf.


Danke,
d0x
 
Zuletzt bearbeitet:
Zurück
Oben Unten