<?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[[WinSock] Problem beim Struktur senden]]></title><description><![CDATA[<p>Hi<br />
Ich bin gerade dabei WinSock in einer Klasse zu kapseln. Bisher klappt alles wunderbar. Jetzt habe ich mich daran gemacht, Dateien zu versenden. Ich benutze insgesamt nur eine Funktion zum versenden von Daten, deshalb sende ich vorher eine Struktur, in der Optionen und ähnliches wichtiges steht. So auch der Dateiname, falls eine Datei gesendet werden soll. Da der User ja einen Pfad, und nicht nur einen Dateinamen angibt, habe ich eine Funktion gebastelt, die den Namen rausholt:</p>
<pre><code class="language-cpp">char *FormatFileString (char *fileString)
{
    int iLen = lstrlen (fileString);
    if (iLen &gt; MAX_PATH)
        return NULL;

    char *data = new char[MAX_PATH];

    int f = 0;
    for (int i = (iLen - 1); fileString[i] != '\\'; --i, ++f)
        data[f] = fileString[i];

    data[f] = '\0';

    iLen = lstrlen (data);
    if (iLen &gt; MAX_PATH)
        return NULL;

    char *result = new char[MAX_PATH];

    f = 0;
    for (int i = (iLen - 1); i &gt;= 0; --i, ++f)
        result[f] = data[i];

    result[f] = '\0';

    return result;
}
</code></pre>
<p>Da die Struktur eben nur den Dateinamen beinhalten soll und nicht den ganzen Pfad, dieser aber der Sende-Funktion überreicht wird, rufe ich diese Funktion auf, bevor ich die Strukur losschicke und fülle die Struktur mit dem Ergebnis. Wenn ich die Strukur dann aber empfangen habe, dann ist die Variable mit dem Dateinamen leer. Sobald ich die Funktion jedoch weglasse und einfach irgendeinen Text sende, ist sie gefüllt. Allerdings ist die Variable vor dem verschicken gefüllt, also leert sie sich scheinbar während, oder kurz vor dem Senden. Jetzt weiß ich bloß nicht woran das liegen kann.<br />
Hier sind noch die Sende- und Empfangsfunktion:</p>
<pre><code class="language-cpp">/*------------------------------------------------------------------||
|| TYPE_STRUCT(x)                                                   ||
||------------------------------------------------------------------||
|| Formatiert eine typedef struct-Instanz, um sie senden und        ||
|| empfangen zu können.                                             ||
||------------------------------------------------------------------*/
#ifndef TYPE_STRUCT
#define TYPE_STRUCT(x)          ( (char *) &amp;x )
#endif
.
.
.
/*------------------------------------------------------------------||
|| WAXSOCKET::RecvData ()                                           ||
||------------------------------------------------------------------||
|| Empfängt Daten über den Socket sSocket und speichert diese in    ||
|| tyData. Bei Bedarf kann die Anzahl der zu übertragenden Bytes    ||
|| mit iBytesToRecv eingeschränkt werden. Ansonsten versucht die    ||
|| Funktion, 500 Bytes zu empfangen und diese in tyData             ||
|| zu speichern. ACHTUNG: Blockierend!                              ||
||------------------------------------------------------------------*/
int WAXSOCKET::RecvData (
        SOCKET sSocket,
        char FAR * tyData,
        int iBytesToRecv = 0    )
{
    if (iBytesToRecv == 0)
        iBytesToRecv = 500;

    recv (sSocket, TYPE_STRUCT (wsh), sizeof (WAXSEND_HEADER), 0);
    if (wsh.iSendMode == SEND_FILE)
    {
        cout &lt;&lt; wsh.lpFile;
    }

    lWaxBytes = recv (sSocket, tyData, iBytesToRecv, 0);
    if (lWaxBytes == 0)
    {
        DetachSocket (sSocket);
        return WSERROR_SOCKETCLOSED;
    }
    else if (lWaxBytes == SOCKET_ERROR)
    {
        return WSERROR_RECIEVE;
    }

    return lWaxBytes;
}

/*------------------------------------------------------------------||
|| WAXSOCKET::SendData ()                                           ||
||------------------------------------------------------------------||
|| Sendet die in tyData enthaltenen Daten über den Socket sSocket   ||
|| Bei Bedarf kann die Anzahl der zu sendenden Bytes mit            ||
|| iBytesToSend eingeschränkt werden. Ansonsten versucht die        ||
|| Funktion, 500 Bytes zu senden.                                   ||
||------------------------------------------------------------------*/
int WAXSOCKET::SendData (
        SOCKET sSocket,
        const char FAR * tyData,
        int iBytesToSend = 0,
        int iSendMode = SEND_DATA    )
{
    if (iBytesToSend == 0)
        iBytesToSend = 500;

    if (iSendMode == SEND_FILE)
    {
        wsh.lpFile = ::FormatFileString ((char *) tyData);
        wsh.iSendMode = SEND_FILE;
        wsh.iBlockSize = SEND_BLOCKSIZE;
    }
    send (sSocket, TYPE_STRUCT (wsh), sizeof (WAXSEND_HEADER), 0);

    lWaxBytes = send (sSocket, tyData, iBytesToSend, 0);
    if (lWaxBytes == SOCKET_ERROR)
    {
        return WSERROR_SEND;
    }

    return lWaxBytes;
}
</code></pre>
<p>DIV Ominion</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/194323/winsock-problem-beim-struktur-senden</link><generator>RSS for Node</generator><lastBuildDate>Tue, 30 Jun 2026 06:40:43 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/194323.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 05 Oct 2007 09:45:00 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to [WinSock] Problem beim Struktur senden on Fri, 05 Oct 2007 10:10:22 GMT]]></title><description><![CDATA[<p>Hi<br />
Ich bin gerade dabei WinSock in einer Klasse zu kapseln. Bisher klappt alles wunderbar. Jetzt habe ich mich daran gemacht, Dateien zu versenden. Ich benutze insgesamt nur eine Funktion zum versenden von Daten, deshalb sende ich vorher eine Struktur, in der Optionen und ähnliches wichtiges steht. So auch der Dateiname, falls eine Datei gesendet werden soll. Da der User ja einen Pfad, und nicht nur einen Dateinamen angibt, habe ich eine Funktion gebastelt, die den Namen rausholt:</p>
<pre><code class="language-cpp">char *FormatFileString (char *fileString)
{
    int iLen = lstrlen (fileString);
    if (iLen &gt; MAX_PATH)
        return NULL;

    char *data = new char[MAX_PATH];

    int f = 0;
    for (int i = (iLen - 1); fileString[i] != '\\'; --i, ++f)
        data[f] = fileString[i];

    data[f] = '\0';

    iLen = lstrlen (data);
    if (iLen &gt; MAX_PATH)
        return NULL;

    char *result = new char[MAX_PATH];

    f = 0;
    for (int i = (iLen - 1); i &gt;= 0; --i, ++f)
        result[f] = data[i];

    result[f] = '\0';

    return result;
}
</code></pre>
<p>Da die Struktur eben nur den Dateinamen beinhalten soll und nicht den ganzen Pfad, dieser aber der Sende-Funktion überreicht wird, rufe ich diese Funktion auf, bevor ich die Strukur losschicke und fülle die Struktur mit dem Ergebnis. Wenn ich die Strukur dann aber empfangen habe, dann ist die Variable mit dem Dateinamen leer. Sobald ich die Funktion jedoch weglasse und einfach irgendeinen Text sende, ist sie gefüllt. Allerdings ist die Variable vor dem verschicken gefüllt, also leert sie sich scheinbar während, oder kurz vor dem Senden. Jetzt weiß ich bloß nicht woran das liegen kann.<br />
Hier sind noch die Sende- und Empfangsfunktion:</p>
<pre><code class="language-cpp">/*------------------------------------------------------------------||
|| TYPE_STRUCT(x)                                                   ||
||------------------------------------------------------------------||
|| Formatiert eine typedef struct-Instanz, um sie senden und        ||
|| empfangen zu können.                                             ||
||------------------------------------------------------------------*/
#ifndef TYPE_STRUCT
#define TYPE_STRUCT(x)          ( (char *) &amp;x )
#endif
.
.
.
/*------------------------------------------------------------------||
|| WAXSOCKET::RecvData ()                                           ||
||------------------------------------------------------------------||
|| Empfängt Daten über den Socket sSocket und speichert diese in    ||
|| tyData. Bei Bedarf kann die Anzahl der zu übertragenden Bytes    ||
|| mit iBytesToRecv eingeschränkt werden. Ansonsten versucht die    ||
|| Funktion, 500 Bytes zu empfangen und diese in tyData             ||
|| zu speichern. ACHTUNG: Blockierend!                              ||
||------------------------------------------------------------------*/
int WAXSOCKET::RecvData (
        SOCKET sSocket,
        char FAR * tyData,
        int iBytesToRecv = 0    )
{
    if (iBytesToRecv == 0)
        iBytesToRecv = 500;

    recv (sSocket, TYPE_STRUCT (wsh), sizeof (WAXSEND_HEADER), 0);
    if (wsh.iSendMode == SEND_FILE)
    {
        cout &lt;&lt; wsh.lpFile;
    }

    lWaxBytes = recv (sSocket, tyData, iBytesToRecv, 0);
    if (lWaxBytes == 0)
    {
        DetachSocket (sSocket);
        return WSERROR_SOCKETCLOSED;
    }
    else if (lWaxBytes == SOCKET_ERROR)
    {
        return WSERROR_RECIEVE;
    }

    return lWaxBytes;
}

/*------------------------------------------------------------------||
|| WAXSOCKET::SendData ()                                           ||
||------------------------------------------------------------------||
|| Sendet die in tyData enthaltenen Daten über den Socket sSocket   ||
|| Bei Bedarf kann die Anzahl der zu sendenden Bytes mit            ||
|| iBytesToSend eingeschränkt werden. Ansonsten versucht die        ||
|| Funktion, 500 Bytes zu senden.                                   ||
||------------------------------------------------------------------*/
int WAXSOCKET::SendData (
        SOCKET sSocket,
        const char FAR * tyData,
        int iBytesToSend = 0,
        int iSendMode = SEND_DATA    )
{
    if (iBytesToSend == 0)
        iBytesToSend = 500;

    if (iSendMode == SEND_FILE)
    {
        wsh.lpFile = ::FormatFileString ((char *) tyData);
        wsh.iSendMode = SEND_FILE;
        wsh.iBlockSize = SEND_BLOCKSIZE;
    }
    send (sSocket, TYPE_STRUCT (wsh), sizeof (WAXSEND_HEADER), 0);

    lWaxBytes = send (sSocket, tyData, iBytesToSend, 0);
    if (lWaxBytes == SOCKET_ERROR)
    {
        return WSERROR_SEND;
    }

    return lWaxBytes;
}
</code></pre>
<p>DIV Ominion</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1378428</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1378428</guid><dc:creator><![CDATA[Ominion]]></dc:creator><pubDate>Fri, 05 Oct 2007 10:10:22 GMT</pubDate></item><item><title><![CDATA[Reply to [WinSock] Problem beim Struktur senden on Fri, 05 Oct 2007 11:01:16 GMT]]></title><description><![CDATA[<p>Du sendest einen Pointer auf eine Zeichenkette. Der ist auf der anderen Seite natürlich nicht gültig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1378500</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1378500</guid><dc:creator><![CDATA[tenchou]]></dc:creator><pubDate>Fri, 05 Oct 2007 11:01:16 GMT</pubDate></item><item><title><![CDATA[Reply to [WinSock] Problem beim Struktur senden on Fri, 05 Oct 2007 11:19:57 GMT]]></title><description><![CDATA[<p>du überprüfst ja noch nicht mal wieviel bytes dir recv gegeben hat <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_down"
      title=":-1:"
      alt="👎"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1378523</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1378523</guid><dc:creator><![CDATA[..........]]></dc:creator><pubDate>Fri, 05 Oct 2007 11:19:57 GMT</pubDate></item><item><title><![CDATA[Reply to [WinSock] Problem beim Struktur senden on Fri, 05 Oct 2007 11:29:05 GMT]]></title><description><![CDATA[<p>So, der Tipp hat mich letztendlich auf den richtigen Weg geführt. Danke.</p>
<p>Mfg Ominion</p>
<p>EDIT: der letzte nicht, sondern der von tenchou<br />
EDIT2: <em>noch</em> brauch ich das auch nicht überprüfen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1378526</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1378526</guid><dc:creator><![CDATA[Ominion]]></dc:creator><pubDate>Fri, 05 Oct 2007 11:29:05 GMT</pubDate></item><item><title><![CDATA[Reply to [WinSock] Problem beim Struktur senden on Fri, 05 Oct 2007 13:33:55 GMT]]></title><description><![CDATA[<blockquote>
<p>noch brauch ich das auch nicht überprüfen</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="😕"
    /> <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="😕"
    /> <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/1378626</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1378626</guid><dc:creator><![CDATA[.........]]></dc:creator><pubDate>Fri, 05 Oct 2007 13:33:55 GMT</pubDate></item><item><title><![CDATA[Reply to [WinSock] Problem beim Struktur senden on Fri, 05 Oct 2007 14:09:21 GMT]]></title><description><![CDATA[<p>solange die geschichte noch nicht wirklich funktioniert, mache ich mir darum keine sorgen</p>
<p>Mfg Ominion</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1378658</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1378658</guid><dc:creator><![CDATA[Ominion]]></dc:creator><pubDate>Fri, 05 Oct 2007 14:09:21 GMT</pubDate></item></channel></rss>