Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Dateien Senden

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: [ 1 ] [ 2 ] > 3 < [ 4 ] [ 5 ]
020
23.08.2005, 15:24 Uhr
Skippy



void ReceiveFiles(const char *filename)

so muss es heissen aber ändert nichts es sei denn int nutzt du um irgendne zahl zurückzugeben um zu testen ob die funktion erfolgreich war oder nicht

wie gesagt füge mal was ich oben gezeigt habe ein hoffe mal dein programm ist konsole?
da kannst du dann sehen ob das an dem abspeichern liegt oder ob recv() das problem darstellt

und sorry die deklaration konnte auch so nicht funktionieren da es zu ner klasse gehört
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
021
08.09.2005, 18:14 Uhr
Michi



Hallo,
Ich mir jetzt was geschrieben, was aber nicht funktioniert. Ich schätze es hat was mit dem binären öffnen oder so zu tun, da wenn ich es normal öffne, und dann den text sende und in eine andere textdatei schreibe, funktioniert es, also hier der code:

Server:

Code:
#include <windows.h>
#include <winsock.h>
#include <stdio.h>
#include <fstream.h>


//Prototypen
int startWinsock(void);

int main()
{
  long rc;
  SOCKET acceptSocket;
  SOCKET connectedSocket;
  SOCKADDR_IN addr;
  char buf[2048];

  // Winsock starten
  rc=startWinsock();
  if(rc!=0)
  {
    printf("Fehler: startWinsock, fehler code: %d\n",rc);
    return 1;
  }
  else
  {
    printf("Winsock gestartet!\n");
  }

  // Socket erstellen
  acceptSocket=socket(AF_INET,SOCK_STREAM,0);
  if(acceptSocket==INVALID_SOCKET)
  {
    printf("Fehler: Der Socket konnte nicht erstellt werden, fehler code: %d\n",WSAGetLastError());
    return 1;
  }
  else
  {
    printf("Socket erstellt!\n");
  }

  // Socket binden
  memset(&addr,0,sizeof(SOCKADDR_IN));
  addr.sin_family=AF_INET;
  addr.sin_port=htons(12345);
  addr.sin_addr.s_addr=inet_addr("127.0.0.1");
  rc=bind(acceptSocket,(SOCKADDR*)&addr,sizeof(SOCKADDR_IN));
  if(rc==SOCKET_ERROR)
  {
    printf("Fehler: bind, fehler code: %d\n",WSAGetLastError());
    return 1;
  }
  else
  {
    printf("Socket an port 12345 gebunden\n");
  }

  // In den listen Modus
  rc=listen(acceptSocket,10);
  if(rc==SOCKET_ERROR)
  {
    printf("Fehler: listen, fehler code: %d\n",WSAGetLastError());
    return 1;
  }
  else
  {
    printf("acceptSocket ist im listen Modus....\n");
  }

  // Verbindung annehmen
  connectedSocket=accept(acceptSocket,NULL,NULL);
  if(connectedSocket==INVALID_SOCKET)
  {
    printf("Fehler: accept, fehler code: %d\n",WSAGetLastError());
    return 1;
  }
  else
  {
    printf("Neue Verbindung wurde akzeptiert!\n");
  }

  // Daten austauschen

  recv(acceptSocket, buf, 1024,0);
  ofstream datei;
  datei.open("D:\\neu.wav",ios::out|ios::binary);
  datei.write(buf, sizeof(buf));
  printf("Fertig");

  closesocket(acceptSocket);
  closesocket(connectedSocket);
  WSACleanup();
  return 0;
}



int startWinsock(void)
{
  WSADATA wsa;
  return WSAStartup(MAKEWORD(2,0),&wsa);
}



Client:

Code:
#include <windows.h>
#include <winsock.h>
#include <stdio.h>
#include <fstream.h>

//Prototypen
int startWinsock(void);

int main()
{
  long rc;
  SOCKET s;
  SOCKADDR_IN addr;
  char buf[2048];


  // 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());
    return 1;
  }
  else
  {
    printf("Socket erstellt!\n");
  }

  // Verbinden
  memset(&addr,0,sizeof(SOCKADDR_IN)); // zuerst alles auf 0 setzten
  addr.sin_family=AF_INET;
  addr.sin_port=htons(12345); // wir verwenden mal port 12345
  addr.sin_addr.s_addr=inet_addr("127.0.0.1"); // zielrechner ist unser eigener

  rc=connect(s,(SOCKADDR*)&addr,sizeof(SOCKADDR));
  if(rc==SOCKET_ERROR)
  {
    printf("Fehler: connect gescheitert, fehler code: %d\n",WSAGetLastError());
    return 1;
  }
  else
  {
    printf("Verbunden mit 127.0.0.1..\n");
  }


  // Daten austauschen

  ifstream datei;
  datei.open("D:\\test.wav", ios::in|ios::binary);
  datei.read(buf, sizeof(buf));
  send(s, buf, sizeof(buf),0);
  printf("Fertig");
  closesocket(s);
  WSACleanup();
  return 0;
}

int startWinsock(void)
{
  WSADATA wsa;
  return WSAStartup(MAKEWORD(2,0),&wsa);
}


--
_____________________________________
_____________Open Source_____________
___Das Wissen, gehört der Menschheit____
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
022
08.09.2005, 20:54 Uhr
Spacelord
Hoffnungsloser Fall


Dein ganzer Code ist vollkommen unsicher.


C++:
send(s, buf, sizeof(buf),0);




Les dir die Beschreibung von send mal genau durch.

send sendet nicht zwangsweise alles was du an Daten übergibst.


Zitat von MSDN:

If no error occurs, send returns the total number of bytes sent, which can be less than the number indicated by len.



Das gleiche gilt für recv.
recv empfängt auch nicht unbedingt immer die volle Puffergrösse.
Die Rückgabewerte von diesen Funktionen musst du prüfen und in ner Schleife,unter zuhilfename eines Offsetwerts,solange Datenpakete versenden bis die ganze Datei gesendet wurde bzw. recv aufrufen bis du die komplette Datei empfangen hast.
Dafür ist es ratsam dem Empfänger als allererstes die Anzahl der Bytes,die ihm gesendet werden,zukommen zu lassen.
Und selbst bei den 4 Bytes mit denen du die Grösse verschickst kannst du nicht sicher sein dass die in einem Rutsch durchgehen und musst den gleichen AUfwand treiben.
Der Unterschied ist nur dass in diesem Fall der Empfänger schon weiß dass als erstes die Anzahl der Bytes kommt und dass dieses Information 4 Bytes groß ist.
Im richtigen Code solltest du natürlich nicht direkt 4 Byte hinschreiben sondern sizeof(int).......

Ich denke bevor das nicht gegeben ist kann man sich ne weitere Fehlersuche schenken.

MfG Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
023
09.09.2005, 07:25 Uhr
Michi



Also meinst du so etwas:
while(!datei.eof)
{
send (s, buf, 4, 0)
}

oder wie?
Ich versteh nicht ganz, was du meinst.
Also ich habe verstanden, dass ich nicht alle auf einmal senden darf...



Zitat:
send sendet nicht zwangsweise alles was du an Daten übergibst.


Gib es ne andere möglichkeit,
alles zu senden?
--
_____________________________________
_____________Open Source_____________
___Das Wissen, gehört der Menschheit____
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
024
09.09.2005, 19:24 Uhr
Spacelord
Hoffnungsloser Fall


Ich meine damit dass dein Aufruf von send eventuell nur 1 Byte von den Daten,die du übergeben hast,sendet.

C++:
send(s, buf, sizeof(buf),0);



Wenn buf 2048 Byte gross ist,kann es sein das send nur 1Byte wirklich versendet!

Was ich meine ist ne Schleife dieser Art:

C++:
int offset=0;
while(offset<sizeof(buf))
{
      int s= send(s,buf+offset,sizeof(buf)-offset,0);
      offset+=s;
}


Mit sowas stellst du sicher das alles gesendet wird.Alles andere ist nen Glücksspiel.
Hast du dir mal die Funktion TransmitFile angeschaut?

MfG Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
025
10.09.2005, 00:22 Uhr
Michi



Wie würde die dazugehörige empfangschleife aussehen?
bei mir funzt es nicht, mit deer die ich gemacht habe
--
_____________________________________
_____________Open Source_____________
___Das Wissen, gehört der Menschheit____
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
026
10.09.2005, 10:09 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Spacelord hat nen kleinen fehler reingemacht, ansonsten würde ichs z.b so machen:


C++:
int offset=0;
int size = sizeof(buf);

if(send(s, &size, sizeof(int), 0) != sizeof(int))
  // error, größe senden fehlgeschlagen

while(offset<size)
{
      int sd = send(s,buf+offset,size-offset,0); // int s, SOCKET s :D etwas ungünstig :D
      offset += sd;
}



Receive dann z.b so:


C++:
int offset = 0;
int size = 0;

if(recv(s, &size, sizeof(int), 0) != sizeof(int))
  // error, größe empfangen fehlgeschlagen, bzw unvollständig

while(offset < size)
{
   int rd = recv(s, buf + offset, size - offset, 0);
   offset += rd;
}


--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
027
10.09.2005, 14:02 Uhr
Spacelord
Hoffnungsloser Fall



Zitat von FloSoft:
Spacelord hat nen kleinen fehler reingemacht, ansonsten würde ichs z.b so machen:


C++:
      int sd = send(s,buf+offset,size-offset,0); // int s, SOCKET s :D etwas ungünstig :D



[/cpp]


Da hast du wohl nicht so ganz unrecht .

MfG Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
028
10.09.2005, 14:03 Uhr
Michi



Fehler,
Beim senden der größe, da send nur char senden jkann, nicht int
--
_____________________________________
_____________Open Source_____________
___Das Wissen, gehört der Menschheit____
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
029
10.09.2005, 14:05 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


dann halt


C++:
if(send(s, (char*)&size, sizeof(int), 0) != sizeof(int))


--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] [ 2 ] > 3 < [ 4 ] [ 5 ]     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: