<?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[Socket Problem mit Thread]]></title><description><![CDATA[<p>Hallo,<br />
ich habe ein sehr komisches Problem</p>
<p>Ich habe eine Serveranwendung und eine Clientanwendung programmiert.<br />
Mit dem Server ist alles in Ordnung.<br />
Der Client hat einen TThread, mit dem er immer recv abfragt.<br />
Wenn der Client jetzt was sendet, bekommt er was zurückgesendet, mehrere Bilder, dies geht also so ca 2s.<br />
Wenn ich den Client in den 2s in den Hintergrund verfrachte, also ein anderes Programm in den Vordergrund hol, kommen ab dem Moment, wo es in den Hintergrund geschickt wurde keine Daten mehr an.<br />
Jetzt muss ich neu connecten.</p>
<p>Hier mal der Threadcode:</p>
<pre><code>__fastcall TRecThread::TRecThread(bool CreateSuspended, SOCKET *s_t, TImage *image_t)
        : TThread(CreateSuspended)
{
        s = *s_t;
        MS = new TMemoryStream;

        image = image_t;

}
//---------------------------------------------------------------------------
void __fastcall TRecThread::Execute()
{
        while (!Terminated)
        {
                if (String(WSAGetLastError()) != &quot;0&quot;)
                Form1-&gt;Caption = String(WSAGetLastError());
                Receive();
if (String(WSAGetLastError()) != &quot;0&quot;)
                Form1-&gt;Caption = String(WSAGetLastError());
        }
}
//---------------------------------------------------------------------------
void __fastcall TRecThread::Receive()
{

/*
machen = 0;
left = 0;
top = 0;
nextgrosse = 0;
receivedall = 0;
*/
        receivedbytes = recv(s, buf, sizeof(buf), 0);

        if (String(WSAGetLastError()) != &quot;0&quot;)
        {
                Application-&gt;MessageBox(String(WSAGetLastError()).c_str(),&quot;a&quot;,0);
        }
        switch (receivedbytes)
        {
                case 0:
                        Application-&gt;MessageBox(&quot;FEHLER&quot;,&quot;FEHLER&quot;,16);
                        Terminate();
                break;
                case SOCKET_ERROR:      // DISCONNECT;
                                Application-&gt;MessageBox(&quot;FEHLER&quot;,&quot;FEHLER&quot;,16);
                                        Terminate();

                break;

                default:
                    buf[receivedbytes]='\0';

                              MS-&gt;Seek(0, soFromEnd);
                              MS-&gt;WriteBuffer(&amp;buf, receivedbytes);

                              MS-&gt;Seek(0 , soFromBeginning);

                              if (machen == 0) MS-&gt;ReadBuffer( &amp;machen, sizeof(int));

                              if ((top == 0) &amp;&amp; (MS-&gt;Size &gt;= 3 * sizeof(int) + sizeof(__int64)))
                              {
                                          MS-&gt;Seek( sizeof(int), soFromBeginning);
                                          MS-&gt;ReadBuffer( &amp;nextgrosse, sizeof(__int64) );

                                          MS-&gt;ReadBuffer( &amp;left, sizeof(int) );
                                          MS-&gt;ReadBuffer( &amp;top, sizeof(int) );
                                       //  Application-&gt;MessageBox( String(nextgrosse).c_str(), &quot;a&quot;,0);

                              }

                              if (MS-&gt;Size &gt;= 3 * sizeof(int) + sizeof(__int64) + nextgrosse)
                              {

                                          MS-&gt;Seek( 3 * sizeof(int) + sizeof(__int64), soFromBeginning);

                                          unsigned char *blubb;

                                          blubb = (unsigned char*)malloc(nextgrosse);

                                          MS-&gt;ReadBuffer(blubb, nextgrosse);

                                          TMemoryStream *MS2 = new TMemoryStream;
                                          MS2-&gt;WriteBuffer (blubb, nextgrosse);

                                          switch (machen)
                                          {
                                                  case SND_PICTURE:
                                                    //Picture_Recv(MS, image);

                                                                  Graphics::TBitmap* Bild = new Graphics::TBitmap;
                                                                  TJPEGImage *jpg = new TJPEGImage;

                                                                  Form1-&gt;Memo1-&gt;Lines-&gt;Add ( String(left) + &quot;_&quot; + String(top) );

                                                                          MS2-&gt;Seek(0 , soFromBeginning);
                                                                          jpg-&gt;LoadFromStream(MS2);
                                                                          jpg-&gt;SaveToFile(&quot;.\\hallo\\&quot; + String(left) + &quot;_&quot; + String(top) + &quot;_a.jpg&quot;);
                                                                          Bild-&gt;Assign(jpg);

                                                                        image-&gt;Canvas-&gt;CopyRect( Rect(left * PICTURE_WIDTH, top * PICTURE_HEIGHT, Bild-&gt;Width, Bild-&gt;Height), Bild-&gt;Canvas,  Rect(0, 0, Bild-&gt;Width, Bild-&gt;Height) );

                                                                  //
                                                                  delete Bild;
                                                                  Bild = NULL;
                                                                  delete jpg;
                                                                  jpg = NULL;

                                                  break;

                                          }

                                          if (MS-&gt;Size == 3 * sizeof(int) + sizeof(__int64) + nextgrosse)
                                          {
                                                MS-&gt;Clear();
                                          }
                                          else
                                          {
                                                ZeroMemory(blubb, nextgrosse);
                                                blubb = (unsigned char*)malloc(MS-&gt;Size - (3 * sizeof(int) + sizeof(__int64) + nextgrosse));
                                                MS-&gt;ReadBuffer(blubb, MS-&gt;Size - (3 * sizeof(int) + sizeof(__int64) + nextgrosse));
                                                MS2-&gt;WriteBuffer(blubb, MS-&gt;Size - (3 * sizeof(int) + sizeof(__int64) + nextgrosse) );

                                                MS-&gt;Clear();
                                                MS-&gt;LoadFromStream(MS2);
                                                //Application-&gt;MessageBox(&quot;neu&quot;,&quot;neu&quot;,16);
                                          }

                                          machen = 0;
                                          left = 0;
                                          top = 0;
                                          nextgrosse = 0;

                                          delete MS2;
                                          delete blubb;

                               }

        }
                ZeroMemory(buf, sizeof(buf));

}

//---------------------------------------------------------------------------
</code></pre>
<p>Woran kann das liegen ?<br />
Ich hab schon so einiges ausprobiert.<br />
Wenn der Client im Vordergrund bleibt, bekommt er alles gesendet.<br />
Der Server schickt auch alles.<br />
WSAGetLastError() gibt immer 0.</p>
<p>Danke, Tim</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/81249/socket-problem-mit-thread</link><generator>RSS for Node</generator><lastBuildDate>Tue, 30 Jun 2026 18:47:10 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/81249.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 29 Jul 2004 13:45:16 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Socket Problem mit Thread on Thu, 29 Jul 2004 13:46:05 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ich habe ein sehr komisches Problem</p>
<p>Ich habe eine Serveranwendung und eine Clientanwendung programmiert.<br />
Mit dem Server ist alles in Ordnung.<br />
Der Client hat einen TThread, mit dem er immer recv abfragt.<br />
Wenn der Client jetzt was sendet, bekommt er was zurückgesendet, mehrere Bilder, dies geht also so ca 2s.<br />
Wenn ich den Client in den 2s in den Hintergrund verfrachte, also ein anderes Programm in den Vordergrund hol, kommen ab dem Moment, wo es in den Hintergrund geschickt wurde keine Daten mehr an.<br />
Jetzt muss ich neu connecten.</p>
<p>Hier mal der Threadcode:</p>
<pre><code>__fastcall TRecThread::TRecThread(bool CreateSuspended, SOCKET *s_t, TImage *image_t)
        : TThread(CreateSuspended)
{
        s = *s_t;
        MS = new TMemoryStream;

        image = image_t;

}
//---------------------------------------------------------------------------
void __fastcall TRecThread::Execute()
{
        while (!Terminated)
        {
                if (String(WSAGetLastError()) != &quot;0&quot;)
                Form1-&gt;Caption = String(WSAGetLastError());
                Receive();
if (String(WSAGetLastError()) != &quot;0&quot;)
                Form1-&gt;Caption = String(WSAGetLastError());
        }
}
//---------------------------------------------------------------------------
void __fastcall TRecThread::Receive()
{

/*
machen = 0;
left = 0;
top = 0;
nextgrosse = 0;
receivedall = 0;
*/
        receivedbytes = recv(s, buf, sizeof(buf), 0);

        if (String(WSAGetLastError()) != &quot;0&quot;)
        {
                Application-&gt;MessageBox(String(WSAGetLastError()).c_str(),&quot;a&quot;,0);
        }
        switch (receivedbytes)
        {
                case 0:
                        Application-&gt;MessageBox(&quot;FEHLER&quot;,&quot;FEHLER&quot;,16);
                        Terminate();
                break;
                case SOCKET_ERROR:      // DISCONNECT;
                                Application-&gt;MessageBox(&quot;FEHLER&quot;,&quot;FEHLER&quot;,16);
                                        Terminate();

                break;

                default:
                    buf[receivedbytes]='\0';

                              MS-&gt;Seek(0, soFromEnd);
                              MS-&gt;WriteBuffer(&amp;buf, receivedbytes);

                              MS-&gt;Seek(0 , soFromBeginning);

                              if (machen == 0) MS-&gt;ReadBuffer( &amp;machen, sizeof(int));

                              if ((top == 0) &amp;&amp; (MS-&gt;Size &gt;= 3 * sizeof(int) + sizeof(__int64)))
                              {
                                          MS-&gt;Seek( sizeof(int), soFromBeginning);
                                          MS-&gt;ReadBuffer( &amp;nextgrosse, sizeof(__int64) );

                                          MS-&gt;ReadBuffer( &amp;left, sizeof(int) );
                                          MS-&gt;ReadBuffer( &amp;top, sizeof(int) );
                                       //  Application-&gt;MessageBox( String(nextgrosse).c_str(), &quot;a&quot;,0);

                              }

                              if (MS-&gt;Size &gt;= 3 * sizeof(int) + sizeof(__int64) + nextgrosse)
                              {

                                          MS-&gt;Seek( 3 * sizeof(int) + sizeof(__int64), soFromBeginning);

                                          unsigned char *blubb;

                                          blubb = (unsigned char*)malloc(nextgrosse);

                                          MS-&gt;ReadBuffer(blubb, nextgrosse);

                                          TMemoryStream *MS2 = new TMemoryStream;
                                          MS2-&gt;WriteBuffer (blubb, nextgrosse);

                                          switch (machen)
                                          {
                                                  case SND_PICTURE:
                                                    //Picture_Recv(MS, image);

                                                                  Graphics::TBitmap* Bild = new Graphics::TBitmap;
                                                                  TJPEGImage *jpg = new TJPEGImage;

                                                                  Form1-&gt;Memo1-&gt;Lines-&gt;Add ( String(left) + &quot;_&quot; + String(top) );

                                                                          MS2-&gt;Seek(0 , soFromBeginning);
                                                                          jpg-&gt;LoadFromStream(MS2);
                                                                          jpg-&gt;SaveToFile(&quot;.\\hallo\\&quot; + String(left) + &quot;_&quot; + String(top) + &quot;_a.jpg&quot;);
                                                                          Bild-&gt;Assign(jpg);

                                                                        image-&gt;Canvas-&gt;CopyRect( Rect(left * PICTURE_WIDTH, top * PICTURE_HEIGHT, Bild-&gt;Width, Bild-&gt;Height), Bild-&gt;Canvas,  Rect(0, 0, Bild-&gt;Width, Bild-&gt;Height) );

                                                                  //
                                                                  delete Bild;
                                                                  Bild = NULL;
                                                                  delete jpg;
                                                                  jpg = NULL;

                                                  break;

                                          }

                                          if (MS-&gt;Size == 3 * sizeof(int) + sizeof(__int64) + nextgrosse)
                                          {
                                                MS-&gt;Clear();
                                          }
                                          else
                                          {
                                                ZeroMemory(blubb, nextgrosse);
                                                blubb = (unsigned char*)malloc(MS-&gt;Size - (3 * sizeof(int) + sizeof(__int64) + nextgrosse));
                                                MS-&gt;ReadBuffer(blubb, MS-&gt;Size - (3 * sizeof(int) + sizeof(__int64) + nextgrosse));
                                                MS2-&gt;WriteBuffer(blubb, MS-&gt;Size - (3 * sizeof(int) + sizeof(__int64) + nextgrosse) );

                                                MS-&gt;Clear();
                                                MS-&gt;LoadFromStream(MS2);
                                                //Application-&gt;MessageBox(&quot;neu&quot;,&quot;neu&quot;,16);
                                          }

                                          machen = 0;
                                          left = 0;
                                          top = 0;
                                          nextgrosse = 0;

                                          delete MS2;
                                          delete blubb;

                               }

        }
                ZeroMemory(buf, sizeof(buf));

}

//---------------------------------------------------------------------------
</code></pre>
<p>Woran kann das liegen ?<br />
Ich hab schon so einiges ausprobiert.<br />
Wenn der Client im Vordergrund bleibt, bekommt er alles gesendet.<br />
Der Server schickt auch alles.<br />
WSAGetLastError() gibt immer 0.</p>
<p>Danke, Tim</p>
]]></description><link>https://www.c-plusplus.net/forum/post/571010</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/571010</guid><dc:creator><![CDATA[MASTER-Tim]]></dc:creator><pubDate>Thu, 29 Jul 2004 13:46:05 GMT</pubDate></item><item><title><![CDATA[Reply to Socket Problem mit Thread on Thu, 29 Jul 2004 14:49:08 GMT]]></title><description><![CDATA[<p>Durchläuft das Programm deine Routinen noch wenn dus in den Hintergrund schickst?</p>
<p>-junix</p>
]]></description><link>https://www.c-plusplus.net/forum/post/571057</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/571057</guid><dc:creator><![CDATA[junix]]></dc:creator><pubDate>Thu, 29 Jul 2004 14:49:08 GMT</pubDate></item><item><title><![CDATA[Reply to Socket Problem mit Thread on Thu, 29 Jul 2004 14:51:41 GMT]]></title><description><![CDATA[<p>ja, er hängt in recv()</p>
<p>aber ich werde jetzt mal die winsocket2 funktionen nutzen...</p>
<p>Tim</p>
]]></description><link>https://www.c-plusplus.net/forum/post/571058</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/571058</guid><dc:creator><![CDATA[MASTER-Tim]]></dc:creator><pubDate>Thu, 29 Jul 2004 14:51:41 GMT</pubDate></item></channel></rss>