<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Binärer Dateitransfer zwischen Visual Basic Client und C++ Server]]></title><description><![CDATA[<p>Hallo!<br />
Ich arbeite an einem Client/Server Projekt, bei dem der Server in MSVC++6.0 (Win32/ein Konsolenprogramm mit Sockets) geschrieben ist und der Client in Visual Basic 6.0 (Standard Exe mit dem Winsock Steuerelement).<br />
Der Client soll in der Lage sein eine Datei vom Server herunterzuladen.</p>
<p>Mein Code funktioniert einwandfrei für Textdateien, aber nicht für Binärdateien. Ich kann eine Textdatei ohne weiteres transferieren, aber ein Jpeg-Bild (gleicher Größe) kommt als korrupte Datei an.</p>
<p>Zu den Details:<br />
<strong>Im C++-Server wird mit einem File-Stream gearbeitet:</strong></p>
<pre><code class="language-cpp">fin = fopen(fName,&quot;rb&quot;)
fseek(fin, fPos, SEEK_SET);
memblock = new char [fChunkSize - 1];
fread(memblock, fChunkSize,1,fin);
sprintf(sendbuffer, &quot;BN|DWNPUT|%i|\0&quot;, fHandle);
strcat(sendbuffer, memblock);
fclose(fin)
send(tSocket,sendbuffer,strlen(sendbuffer),0);
memset(&amp;memblock, 0, sizeof(memblock));
memset(&amp;sendbuffer, 0, sizeof(sendbuffer));
</code></pre>
<p>Diese Funktion wird für jeden Block ausgeführt. D.h wenn dieser Block beim Clienten angekommen ist, verlangt der Client den nächsten und diese Prozedur wird im Server wieder anfgerufen.</p>
<p>Diese Methode habe ich bereits mit reinem Visual Basic getestet (Client und Server in VB), es funktioniert!</p>
<p><strong>Der Visual Basic Client geht etwa so vor:</strong><br />
Open .LocalFile For Binary As .LocalFileNumber<br />
[..]<br />
Dim Data As String<br />
wskWinsock(Index).GetData Data<br />
Dim BlockStart As Integer<br />
[..]<br />
BlockStart = InStr(11, Data, &quot;|&quot;, vbTextCompare)<br />
Dim BinData As String<br />
BinData = Right(Data, Len(Data) - BlockStart)<br />
[..]<br />
Put .LocalFileNumber, .FilePos + 1, BinData<br />
[..]<br />
SendData &quot;00|DWNGET|[..]&quot;<br />
[..]<br />
Close .LocalFileNumber</p>
<p><strong>Das Problem:</strong><br />
Textdateien kommen auf den Byte richtig an, allerdings kommen Binäredateien korrupt an. Schaut man sich den Dateiinhalt an, findet man sehr viele Zeichen, die in der Orginaldatei nicht da waren.<br />
Woran könnte das liegen?<br />
Benutzt VB womöglich einen anderen Zeichensatz? Unicode Probleme??</p>
<p>Ich bin für jede Hilfe sehr Dankbar!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/192693/binärer-dateitransfer-zwischen-visual-basic-client-und-c-server</link><generator>RSS for Node</generator><lastBuildDate>Sun, 27 Sep 2026 17:27:11 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/192693.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 17 Sep 2007 16:09:38 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Binärer Dateitransfer zwischen Visual Basic Client und C++ Server on Mon, 17 Sep 2007 16:09:38 GMT]]></title><description><![CDATA[<p>Hallo!<br />
Ich arbeite an einem Client/Server Projekt, bei dem der Server in MSVC++6.0 (Win32/ein Konsolenprogramm mit Sockets) geschrieben ist und der Client in Visual Basic 6.0 (Standard Exe mit dem Winsock Steuerelement).<br />
Der Client soll in der Lage sein eine Datei vom Server herunterzuladen.</p>
<p>Mein Code funktioniert einwandfrei für Textdateien, aber nicht für Binärdateien. Ich kann eine Textdatei ohne weiteres transferieren, aber ein Jpeg-Bild (gleicher Größe) kommt als korrupte Datei an.</p>
<p>Zu den Details:<br />
<strong>Im C++-Server wird mit einem File-Stream gearbeitet:</strong></p>
<pre><code class="language-cpp">fin = fopen(fName,&quot;rb&quot;)
fseek(fin, fPos, SEEK_SET);
memblock = new char [fChunkSize - 1];
fread(memblock, fChunkSize,1,fin);
sprintf(sendbuffer, &quot;BN|DWNPUT|%i|\0&quot;, fHandle);
strcat(sendbuffer, memblock);
fclose(fin)
send(tSocket,sendbuffer,strlen(sendbuffer),0);
memset(&amp;memblock, 0, sizeof(memblock));
memset(&amp;sendbuffer, 0, sizeof(sendbuffer));
</code></pre>
<p>Diese Funktion wird für jeden Block ausgeführt. D.h wenn dieser Block beim Clienten angekommen ist, verlangt der Client den nächsten und diese Prozedur wird im Server wieder anfgerufen.</p>
<p>Diese Methode habe ich bereits mit reinem Visual Basic getestet (Client und Server in VB), es funktioniert!</p>
<p><strong>Der Visual Basic Client geht etwa so vor:</strong><br />
Open .LocalFile For Binary As .LocalFileNumber<br />
[..]<br />
Dim Data As String<br />
wskWinsock(Index).GetData Data<br />
Dim BlockStart As Integer<br />
[..]<br />
BlockStart = InStr(11, Data, &quot;|&quot;, vbTextCompare)<br />
Dim BinData As String<br />
BinData = Right(Data, Len(Data) - BlockStart)<br />
[..]<br />
Put .LocalFileNumber, .FilePos + 1, BinData<br />
[..]<br />
SendData &quot;00|DWNGET|[..]&quot;<br />
[..]<br />
Close .LocalFileNumber</p>
<p><strong>Das Problem:</strong><br />
Textdateien kommen auf den Byte richtig an, allerdings kommen Binäredateien korrupt an. Schaut man sich den Dateiinhalt an, findet man sehr viele Zeichen, die in der Orginaldatei nicht da waren.<br />
Woran könnte das liegen?<br />
Benutzt VB womöglich einen anderen Zeichensatz? Unicode Probleme??</p>
<p>Ich bin für jede Hilfe sehr Dankbar!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1367126</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1367126</guid><dc:creator><![CDATA[CodeRed]]></dc:creator><pubDate>Mon, 17 Sep 2007 16:09:38 GMT</pubDate></item><item><title><![CDATA[Reply to Binärer Dateitransfer zwischen Visual Basic Client und C++ Server on Mon, 17 Sep 2007 16:24:04 GMT]]></title><description><![CDATA[<p>Ich nutze immer fstream und bei den Funktionen ofstream und ifstream kann man mit ios auf binäre Dateisysteme umstellen. Denke da wird also ein Unterschied sein... vielleicht versuchst du es mal damit! Weiss aber nicht, ob dir das weiterhilft!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1367146</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1367146</guid><dc:creator><![CDATA[Jimmie]]></dc:creator><pubDate>Mon, 17 Sep 2007 16:24:04 GMT</pubDate></item><item><title><![CDATA[Reply to Binärer Dateitransfer zwischen Visual Basic Client und C++ Server on Mon, 17 Sep 2007 19:25:55 GMT]]></title><description><![CDATA[<p>Ich bezweifle, dass das funktioniert, da die Zeile:</p>
<pre><code class="language-cpp">fin = fopen(fName,&quot;rb&quot;)
</code></pre>
<p>die Datei schon eindeutig für den binären lesevorgang öffnet.<br />
r=read und b=binary<br />
Ein Versuch kann trotzdem nicht schaden. Ich werde mich morgen wieder melden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1367287</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1367287</guid><dc:creator><![CDATA[CodeRed]]></dc:creator><pubDate>Mon, 17 Sep 2007 19:25:55 GMT</pubDate></item><item><title><![CDATA[Reply to Binärer Dateitransfer zwischen Visual Basic Client und C++ Server on Mon, 17 Sep 2007 19:36:49 GMT]]></title><description><![CDATA[<p>Ich habe es jetzt gestestet, mit...</p>
<pre><code class="language-cpp">File *fin;
fin = fopen(fName,&quot;rb&quot;)
[..]
fseek(fin, fPos, SEEK_SET);
[..]
fread(memblock, fChunkSize,1,fin);
[..]
fclose(fin)
</code></pre>
<p>passiert das gleiche wie mit...</p>
<pre><code class="language-cpp">ifstream file (&quot;fName&quot;, ios::in | ios::binary)
[..]
file.seekg(fPos, ios_base::beg);
[..]
file.read (memblock, fChunkSize);
[..]
file.close();
</code></pre>
<p>trotzdem danke!<br />
vielleicht kennt ein anderer die Lösung</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1367297</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1367297</guid><dc:creator><![CDATA[CodeRed]]></dc:creator><pubDate>Mon, 17 Sep 2007 19:36:49 GMT</pubDate></item><item><title><![CDATA[Reply to Binärer Dateitransfer zwischen Visual Basic Client und C++ Server on Mon, 17 Sep 2007 20:33:13 GMT]]></title><description><![CDATA[<p>CodeRed schrieb:</p>
<blockquote>
<pre><code class="language-cpp">...
strcat(sendbuffer, memblock);
...
send(tSocket,sendbuffer,strlen(sendbuffer),0);
...
</code></pre>
</blockquote>
<p><em>strcat</em> macht bei der ersten 0 schluss, geht also nicht für binärdaten. nimm besser <em>memcpy</em>.<br />
du solltest auch den rückgabewert von <em>send</em> beachten.<br />
<img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1367322</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1367322</guid><dc:creator><![CDATA[Undertaker]]></dc:creator><pubDate>Mon, 17 Sep 2007 20:33:13 GMT</pubDate></item><item><title><![CDATA[Reply to Binärer Dateitransfer zwischen Visual Basic Client und C++ Server on Mon, 17 Sep 2007 23:01:52 GMT]]></title><description><![CDATA[<p>Und fread(memblock, fChunkSize,1,fin) gegen fread(memblock, 1,fChunkSize,fin) tauschen, und den Returncode auswerten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1367363</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1367363</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 17 Sep 2007 23:01:52 GMT</pubDate></item><item><title><![CDATA[Reply to Binärer Dateitransfer zwischen Visual Basic Client und C++ Server on Tue, 18 Sep 2007 05:59:34 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Und fread(memblock, fChunkSize,1,fin) gegen fread(memblock, 1,fChunkSize,fin) tauschen...</p>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1367399</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1367399</guid><dc:creator><![CDATA[Undertaker]]></dc:creator><pubDate>Tue, 18 Sep 2007 05:59:34 GMT</pubDate></item><item><title><![CDATA[Reply to Binärer Dateitransfer zwischen Visual Basic Client und C++ Server on Tue, 18 Sep 2007 14:09:44 GMT]]></title><description><![CDATA[<p>Ja lies halt die Doku.<br />
fread(p, 100, 1, f)<br />
wird 0 zurückgeben wenn z.B. nach 90 Byte EOF war.<br />
fread(p, 1, 100, f)<br />
wird dagegen in dem Fall 90 liefern.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1367791</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1367791</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 18 Sep 2007 14:09:44 GMT</pubDate></item><item><title><![CDATA[Reply to Binärer Dateitransfer zwischen Visual Basic Client und C++ Server on Tue, 18 Sep 2007 15:43:11 GMT]]></title><description><![CDATA[<blockquote>
<p>strcat macht bei der ersten 0 schluss, geht also nicht für binärdaten.</p>
</blockquote>
<p>klang sehr viel versprechend.<br />
Habe</p>
<pre><code class="language-cpp">fin = fopen(fName,&quot;rb&quot;)
fseek(fin, fPos, SEEK_SET);

char * memblock;
char * sendbuffer;
memblock = new char [fChunkSize - 1];
sendbuffer = new char [fChunkSize+40];

fread(memblock, fChunkSize,1,fin);
sprintf(sendbuffer, &quot;BN|DWNPUT|%i|\0&quot;, fHandle);
strcat(sendbuffer, memblock);

fclose(fin);
send(tSocket,sendbuffer,strlen(sendbuffer),0);
memset(&amp;memblock, 0, sizeof(memblock));
memset(&amp;sendbuffer, 0, sizeof(sendbuffer));
</code></pre>
<p>Gegen</p>
<pre><code class="language-cpp">fin = fopen(fName,&quot;rb&quot;)
fseek(fin, fPos, SEEK_SET);

char * memblock;
char * sendbuffer;
memblock = new char [fChunkSize - 1];
sendbuffer = new char [fChunkSize+40];

fread(memblock, 1,fChunkSize,fin);
sprintf(sendbuffer, &quot;BN|DWNPUT|%i|\0&quot;, fHandle);
memmove (sendbuffer+strlen(sendbuffer),memblock,fChunkSize);

fclose(fin);
send(tSocket,sendbuffer,strlen(sendbuffer),0);
memset(&amp;memblock, 0, sizeof(memblock));
memset(&amp;sendbuffer, 0, sizeof(sendbuffer));
</code></pre>
<p>ausgetauscht und werde es so lassen, da ich auch denke das '\0'-Zeichen im Binärenstream Probleme verursachen könnten und das Programm so schneller läuft.<br />
<strong>Es löst aber nicht das Problem</strong><br />
-CreateFile, ReadFile Apis gegen fin = fopen(fName,&quot;rb&quot;) austauschen, hat nichts gebracht<br />
-fin = fopen(fName,&quot;rb&quot;) gegen ifstream file (fName, ios::in | ios::binary), hat auch nichts gebracht<br />
-strcat gegen memmove hat auch nichts gebracht.</p>
<p>ich denke immer noch, dass es an einem Unterschied zwischen dem Umgang mit Strings zwischen Visual Basic und C++ liegt. Kann mir den keiner Helfen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1367859</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1367859</guid><dc:creator><![CDATA[CodeRed]]></dc:creator><pubDate>Tue, 18 Sep 2007 15:43:11 GMT</pubDate></item><item><title><![CDATA[Reply to Binärer Dateitransfer zwischen Visual Basic Client und C++ Server on Tue, 18 Sep 2007 18:49:59 GMT]]></title><description><![CDATA[<p>du benutzt strlen!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1367991</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1367991</guid><dc:creator><![CDATA[fehler!]]></dc:creator><pubDate>Tue, 18 Sep 2007 18:49:59 GMT</pubDate></item><item><title><![CDATA[Reply to Binärer Dateitransfer zwischen Visual Basic Client und C++ Server on Tue, 18 Sep 2007 19:06:11 GMT]]></title><description><![CDATA[<blockquote>
<p>[code]Dim Data As String<br />
wskWinsock(Index).GetData Data<br />
[code]</p>
</blockquote>
<p>Woher weiss &quot;wskWinsock(Index).GetData&quot; wieviele Daten gelesen werden sollen???</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1368006</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1368006</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 18 Sep 2007 19:06:11 GMT</pubDate></item><item><title><![CDATA[Reply to Binärer Dateitransfer zwischen Visual Basic Client und C++ Server on Wed, 19 Sep 2007 08:46:51 GMT]]></title><description><![CDATA[<p>ja ich weiß, aber mit 'sizeof' funktioniert es nicht. was kann ich sonst benutzen?<br />
Ich will auch noch die Rückgaben der read-Funktionen überprüfen, um zu sehen, ob da der gesammte Block gelesen wird oder ob er schon da verloren geht. Bei der Send-Funktion will ich das gleiche machen.</p>
<p>Aber welche Alternativen zu 'strlen' gibt es den?</p>
<p>Danke für die schnellen Antworten!</p>
<p>an Hustbaer: In Visual Basic muss man die Länge nicht angeben. Die Strings werden anders aufgebaut als in C++. Am Anfang eines VB-Strings steht die Länge des gesammten Strings, daher sind Längenangaben und Terminator am Ende nicht mehr nötig.</p>
<p>Ich dachte ursprünglich das da das Problem liegt. Jetzt stelle ich fest, dass es mit einem C++ Clienten auch nicht funktioniert! (Es kommt zu wenig an)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1368246</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1368246</guid><dc:creator><![CDATA[CodeRed]]></dc:creator><pubDate>Wed, 19 Sep 2007 08:46:51 GMT</pubDate></item><item><title><![CDATA[Reply to Binärer Dateitransfer zwischen Visual Basic Client und C++ Server on Wed, 19 Sep 2007 14:05:19 GMT]]></title><description><![CDATA[<p>Ich habe das Problem gerade eben lösen können. Dazu habe ich strlen durch eine errechnete Packetgröße ersetzt.</p>
<pre><code class="language-cpp">long tosend=fChunkSize+strlen(sendbuffer)
</code></pre>
<p>(-&gt; direkt nach dem eingeben des Befehls in den SendBuffer, vor memmove)</p>
<p>So funktioniert alles.<br />
-SizeOf hört wohl da auf, wo sich in dem CharArray nichts mehr befindet, was aber bei Jpeg-Bildern durchaus vorkommen kann.<br />
-Strlen hört beim ersten &quot;\0&quot; auf, was auch im Binärenstrom vorkommen kann.</p>
<p>Ich danke allen, die sich die Mühe gemacht haben mir zu Antworten!<br />
<strong>Problem gelöst!</strong></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1368559</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1368559</guid><dc:creator><![CDATA[CodeRed]]></dc:creator><pubDate>Wed, 19 Sep 2007 14:05:19 GMT</pubDate></item><item><title><![CDATA[Reply to Binärer Dateitransfer zwischen Visual Basic Client und C++ Server on Thu, 20 Sep 2007 11:16:56 GMT]]></title><description><![CDATA[<p>CodeRed schrieb:</p>
<blockquote>
<p>Dazu habe ich strlen durch eine errechnete Packetgröße ersetzt.</p>
</blockquote>
<p>Bitte, bitte entweder Paketgröße oder packet size <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1369149</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1369149</guid><dc:creator><![CDATA[HumeSikkins]]></dc:creator><pubDate>Thu, 20 Sep 2007 11:16:56 GMT</pubDate></item></channel></rss>