<?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[Probleme mit TNMStrmServ]]></title><description><![CDATA[<p>Hi Alle miteinander!</p>
<p>Ich habe mir 2 kleine Klassen (TStreamServer, TStreamClient) geschmiedet, die den Datenaustausch zwischen 2 Rechnern organisieren sollen. Darin wird jeweils ein TNMStrmServ (zum Empfangen) und ein TNMStrm (zum Senden) verwendet. Soweit so gut, kompilieren klappt fehlerfrei.</p>
<p>Zum austesten habe ich mir ein kleines Testprojekt gebastelt was aber entweder mit der Exception &quot;Connection failed&quot; (NMStrmServ-&gt;Listen(false); nicht auskommentiert) abschmiert, oder sich festfährt (NMStrmServ-&gt;Listen(false); einkommentiert).</p>
<p>Wo liegt der Fehler?</p>
<pre><code class="language-cpp">__fastcall TStreamServer::TStreamServer(TComponent* Owner, int iPort)
{
           NMStrmServ              = new TNMStrmServ(Owner);
           NMStrmServ-&gt;Port        = iPort;
           NMStrmServ-&gt;ReportLevel = 0;
           NMStrmServ-&gt;OnMSG       = NMStrmServMSG;
           NMStrmServ-&gt;TimeOut     = 0;
           //NMStrmServ-&gt;Listen(false); 
}

__fastcall TStreamServer::~TStreamServer()
{
           if (NMStrmServ) delete NMStrmServ;
}

void __fastcall TStreamServer::NMStrmServMSG(TComponent *Sender, const AnsiString sFrom, TStream *strm)
{
     TStreamHeader Header;
     TMemoryStream *msSendData = NULL;

     TMemoryStream *msIncomingData = new TMemoryStream();
     msIncomingData-&gt;CopyFrom(strm, strm-&gt;Size);
     msIncomingData-&gt;Seek(0, soFromBeginning);

     memset(&amp;Header, 0, sizeof(Header));

     // Header lesen
     msIncomingData-&gt;Read(&amp;Header, sizeof(Header));

     // Commando im Stream auswerten
     switch (Header.iCommand)
     {
            // Stream-Anforderung
            case CMD_REQUEST_STREAM   : { break; }
            // Stream-Sendung
            case CMD_DELIVER_STREAM   : { break; }
            default : {}
     }

     if (msIncomingData) delete msIncomingData;
     if (msSendData)     delete msSendData;
}

__fastcall TStreamClient::TStreamClient(TComponent* Owner, AnsiString sHost, AnsiString sFrom, int iPort)
{
           NMStrm              = new TNMStrm(Owner);
           NMStrm-&gt;Port        = iPort;
           NMStrm-&gt;ReportLevel = 0;
           NMStrm-&gt;Host        = sHost;
           NMStrm-&gt;FromName    = sFrom;
           NMStrm-&gt;TimeOut     = 0;
}

__fastcall TStreamClient::~TStreamClient()
{
           if (NMStrm) delete NMStrm;
}

bool __fastcall TStreamClient::SendCommand(TStreamHeader Header, TStream *Stream)
{
     bool bRetVal = true;
     TMemoryStream *msSendData = NULL;
     TMemoryStream *msStreamData = NULL;

     try
     {
        try
        {
           msSendData = new TMemoryStream();

           // Header schreiben
           msSendData-&gt;Write(&amp;Header, sizeof(Header));

           // und evtl. Nutzdaten mitsenden
           if (Stream)
           {
              // zu sendendes TStream-Objekt in Memorystream wandeln
              try
              {
                 msStreamData = new TMemoryStream();

                 msStreamData-&gt;CopyFrom(Stream, Stream-&gt;Size);
                 msStreamData-&gt;Seek(0, soFromBeginning);
                 msStreamData-&gt;SaveToStream(msSendData);
              }
              catch ( Exception &amp;E )
              {
                    sLastError = E.Message;
              }
           }

           NMStrm-&gt;PostIt(msSendData);
        }
        catch ( Exception &amp;E )
        {
              sLastError = E.Message;
              bRetVal = false;
        }
     }
     __finally
     {
              if (msSendData)   delete msSendData;
              if (msStreamData) delete msStreamData;
     }

     return bRetVal;
}
</code></pre>
<p>Hier noch das Testprojekt:</p>
<pre><code class="language-cpp">__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
{
           Serv = new TStreamServer(this, 10000);
           Client = new TStreamClient(this, &quot;localhost&quot;, &quot;TestClient&quot;, 10000);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormDestroy(TObject *Sender)
{
     delete Serv;
     delete Client;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
     TStreamHeader Header;
     memset(&amp;Header, 0, sizeof(Header));

     // Header erzeugen
     Header.iCommand = CMD_REQUEST_STREAM;

     // testweise erstmal nur einen Header schicken
     Client-&gt;SendCommand(Header, NULL);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/85458/probleme-mit-tnmstrmserv</link><generator>RSS for Node</generator><lastBuildDate>Fri, 03 Jul 2026 01:57:34 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/85458.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 09 Sep 2004 07:48:19 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Probleme mit TNMStrmServ on Thu, 09 Sep 2004 07:48:19 GMT]]></title><description><![CDATA[<p>Hi Alle miteinander!</p>
<p>Ich habe mir 2 kleine Klassen (TStreamServer, TStreamClient) geschmiedet, die den Datenaustausch zwischen 2 Rechnern organisieren sollen. Darin wird jeweils ein TNMStrmServ (zum Empfangen) und ein TNMStrm (zum Senden) verwendet. Soweit so gut, kompilieren klappt fehlerfrei.</p>
<p>Zum austesten habe ich mir ein kleines Testprojekt gebastelt was aber entweder mit der Exception &quot;Connection failed&quot; (NMStrmServ-&gt;Listen(false); nicht auskommentiert) abschmiert, oder sich festfährt (NMStrmServ-&gt;Listen(false); einkommentiert).</p>
<p>Wo liegt der Fehler?</p>
<pre><code class="language-cpp">__fastcall TStreamServer::TStreamServer(TComponent* Owner, int iPort)
{
           NMStrmServ              = new TNMStrmServ(Owner);
           NMStrmServ-&gt;Port        = iPort;
           NMStrmServ-&gt;ReportLevel = 0;
           NMStrmServ-&gt;OnMSG       = NMStrmServMSG;
           NMStrmServ-&gt;TimeOut     = 0;
           //NMStrmServ-&gt;Listen(false); 
}

__fastcall TStreamServer::~TStreamServer()
{
           if (NMStrmServ) delete NMStrmServ;
}

void __fastcall TStreamServer::NMStrmServMSG(TComponent *Sender, const AnsiString sFrom, TStream *strm)
{
     TStreamHeader Header;
     TMemoryStream *msSendData = NULL;

     TMemoryStream *msIncomingData = new TMemoryStream();
     msIncomingData-&gt;CopyFrom(strm, strm-&gt;Size);
     msIncomingData-&gt;Seek(0, soFromBeginning);

     memset(&amp;Header, 0, sizeof(Header));

     // Header lesen
     msIncomingData-&gt;Read(&amp;Header, sizeof(Header));

     // Commando im Stream auswerten
     switch (Header.iCommand)
     {
            // Stream-Anforderung
            case CMD_REQUEST_STREAM   : { break; }
            // Stream-Sendung
            case CMD_DELIVER_STREAM   : { break; }
            default : {}
     }

     if (msIncomingData) delete msIncomingData;
     if (msSendData)     delete msSendData;
}

__fastcall TStreamClient::TStreamClient(TComponent* Owner, AnsiString sHost, AnsiString sFrom, int iPort)
{
           NMStrm              = new TNMStrm(Owner);
           NMStrm-&gt;Port        = iPort;
           NMStrm-&gt;ReportLevel = 0;
           NMStrm-&gt;Host        = sHost;
           NMStrm-&gt;FromName    = sFrom;
           NMStrm-&gt;TimeOut     = 0;
}

__fastcall TStreamClient::~TStreamClient()
{
           if (NMStrm) delete NMStrm;
}

bool __fastcall TStreamClient::SendCommand(TStreamHeader Header, TStream *Stream)
{
     bool bRetVal = true;
     TMemoryStream *msSendData = NULL;
     TMemoryStream *msStreamData = NULL;

     try
     {
        try
        {
           msSendData = new TMemoryStream();

           // Header schreiben
           msSendData-&gt;Write(&amp;Header, sizeof(Header));

           // und evtl. Nutzdaten mitsenden
           if (Stream)
           {
              // zu sendendes TStream-Objekt in Memorystream wandeln
              try
              {
                 msStreamData = new TMemoryStream();

                 msStreamData-&gt;CopyFrom(Stream, Stream-&gt;Size);
                 msStreamData-&gt;Seek(0, soFromBeginning);
                 msStreamData-&gt;SaveToStream(msSendData);
              }
              catch ( Exception &amp;E )
              {
                    sLastError = E.Message;
              }
           }

           NMStrm-&gt;PostIt(msSendData);
        }
        catch ( Exception &amp;E )
        {
              sLastError = E.Message;
              bRetVal = false;
        }
     }
     __finally
     {
              if (msSendData)   delete msSendData;
              if (msStreamData) delete msStreamData;
     }

     return bRetVal;
}
</code></pre>
<p>Hier noch das Testprojekt:</p>
<pre><code class="language-cpp">__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
{
           Serv = new TStreamServer(this, 10000);
           Client = new TStreamClient(this, &quot;localhost&quot;, &quot;TestClient&quot;, 10000);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormDestroy(TObject *Sender)
{
     delete Serv;
     delete Client;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
     TStreamHeader Header;
     memset(&amp;Header, 0, sizeof(Header));

     // Header erzeugen
     Header.iCommand = CMD_REQUEST_STREAM;

     // testweise erstmal nur einen Header schicken
     Client-&gt;SendCommand(Header, NULL);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/602970</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/602970</guid><dc:creator><![CDATA[F98]]></dc:creator><pubDate>Thu, 09 Sep 2004 07:48:19 GMT</pubDate></item></channel></rss>