<?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[Einfacher HTTP Server, sendet keine Daten]]></title><description><![CDATA[<p>Ich habe aus dem Buch Visual <a href="http://C++.NET" rel="nofollow">C++.NET</a>, das Beispiel für einen kleinen HTTP-Server<br />
abgetippt, es kompiliert ohne Probleme, aber der Server kann keine Daten senden,<br />
auch die Version von der CD, sendet keine Daten, beim Aufruf über 'localhost' im<br />
Browser.<br />
Mein Webserver (Apache), funktioniert beim Aufruf, über den localhost, denke es<br />
liegt daher wohl bei der Implementierung ein Fehler vor.</p>
<p>Das Programm leitet 2Klassen von CAsyncSocket ab, einmal die CListenSocket und<br />
die CRequestSocket.<br />
Die Klasse CListenSocket erstellt ein Objekt von CRequestSocket, in der<br />
überschriebenen Methode OnAccept.<br />
Die Klasse CRequestObjekt empfängt, dann die Daten des Clients und sendet einen<br />
Header + ein einfaches &quot;Hallo Welt&quot;, egal was der Client sendet.</p>
<p>Der Socket wird erstellt in der InitInstance () der Anwendungsklasse, dort wird<br />
nach den Zeilen</p>
<pre><code class="language-cpp">CWinApp::InitInstance();

	if (!AfxSocketInit())
	{
		AfxMessageBox(IDP_SOCKETS_INIT_FAILED);
		return FALSE;
	}
</code></pre>
<p>Die Methode StartListening () aufgerufen, welche einen neuen Socket auf Port 80<br />
erstellt.<br />
StartListening und StopListening</p>
<pre><code class="language-cpp">void CIsrvBSPApp::StartListening(void)
{
	StopListening ();

	m_pListen = new CListenSocket ();
	if (m_pListen) {
		if (m_pListen-&gt;Create (80, SOCK_STREAM, FD_ACCEPT))
			m_pListen-&gt;Listen ();
	}
}

void CIsrvBSPApp::StopListening(void)
{
	if (m_pListen) {
		m_pListen-&gt;Close ();
		delete m_pListen;
		m_pListen = NULL;
	}
}
</code></pre>
<p>StopListening wird beim beenden des Programmes aufgerufen.</p>
<p>Die Klasse CListenSocket:</p>
<pre><code class="language-cpp">//Header
#pragma once
#include &quot;stdafx.h&quot;
#include &quot;RequestSocket.h&quot;

class CListenSocket :
	public CAsyncSocket
{
public:
	CListenSocket(void);
	virtual void OnAccept (int nErrorCode);
	~CListenSocket(void);
};
</code></pre>
<pre><code class="language-cpp">//Implementierungsdatei
#include &quot;StdAfx.h&quot;
#include &quot;.\listensocket.h&quot;

CListenSocket::CListenSocket(void)
{
}

CListenSocket::~CListenSocket(void)
{
}

void CListenSocket::OnAccept (int nErrorCode) {

	CRequestSocket *pRequest = new CRequestSocket ();
	if (Accept (*pRequest)) {
		pRequest-&gt;AsyncSelect (FD_READ | FD_CLOSE);
	}
}
</code></pre>
<p>Die Klasse CRequestSocket</p>
<pre><code class="language-cpp">//Header
#pragma once
#include &quot;afxsock.h&quot;
#include &lt;cstring&gt;

const int m_BufSize = 1024;
const char m_header[] = &quot;HTTP/1.0 200 OK\r\n&quot;
&quot;Server: Mein erster Server\r\n&quot;
&quot;Date: Mon, 24 Oktober 2001 12:00:00 GTM\r\n&quot;
&quot;Content-Type: text/html\r\n&quot;
&quot;Accept-Ranges: bytes\r\n&quot;
&quot;Content-Length: 10\r\n&quot;
&quot;\r\n&quot;;
class CRequestSocket :
	public CAsyncSocket
{
public:
	CRequestSocket(void);
	~CRequestSocket(void);

	virtual void OnReceive (int nErrorCode);
	virtual void OnSend (int nErrorCode);
private:

	char m_buffer[m_BufSize];
};
</code></pre>
<pre><code class="language-cpp">//Implementierungsdatei
#include &quot;StdAfx.h&quot;
#include &quot;.\requestsocket.h&quot;

CRequestSocket::CRequestSocket(void)
{
}

CRequestSocket::~CRequestSocket(void)
{
}

void CRequestSocket::OnReceive (int nErrorCode)
{
	Receive (m_buffer, m_BufSize);

	std::strcpy (m_buffer, m_header);
	std::strcpy (m_buffer+strlen (m_header), &quot;Hallo Welt&quot;);
	AsyncSelect (FD_WRITE | FD_CLOSE);
}

void CRequestSocket::OnSend (int nErrorCode)
{
	Send (m_buffer, std::strlen (m_header + std::strlen (&quot;Hallo Welt&quot;)));
	ShutDown (both);
	delete this;
}
</code></pre>
<p>Nun die Frage, weshalb wird nichts versendet?</p>
<p>Danke für eure Mühe <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/topic/69513/einfacher-http-server-sendet-keine-daten</link><generator>RSS for Node</generator><lastBuildDate>Fri, 01 May 2026 09:38:01 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/69513.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 28 Mar 2004 17:43:37 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Einfacher HTTP Server, sendet keine Daten on Sun, 28 Mar 2004 17:43:37 GMT]]></title><description><![CDATA[<p>Ich habe aus dem Buch Visual <a href="http://C++.NET" rel="nofollow">C++.NET</a>, das Beispiel für einen kleinen HTTP-Server<br />
abgetippt, es kompiliert ohne Probleme, aber der Server kann keine Daten senden,<br />
auch die Version von der CD, sendet keine Daten, beim Aufruf über 'localhost' im<br />
Browser.<br />
Mein Webserver (Apache), funktioniert beim Aufruf, über den localhost, denke es<br />
liegt daher wohl bei der Implementierung ein Fehler vor.</p>
<p>Das Programm leitet 2Klassen von CAsyncSocket ab, einmal die CListenSocket und<br />
die CRequestSocket.<br />
Die Klasse CListenSocket erstellt ein Objekt von CRequestSocket, in der<br />
überschriebenen Methode OnAccept.<br />
Die Klasse CRequestObjekt empfängt, dann die Daten des Clients und sendet einen<br />
Header + ein einfaches &quot;Hallo Welt&quot;, egal was der Client sendet.</p>
<p>Der Socket wird erstellt in der InitInstance () der Anwendungsklasse, dort wird<br />
nach den Zeilen</p>
<pre><code class="language-cpp">CWinApp::InitInstance();

	if (!AfxSocketInit())
	{
		AfxMessageBox(IDP_SOCKETS_INIT_FAILED);
		return FALSE;
	}
</code></pre>
<p>Die Methode StartListening () aufgerufen, welche einen neuen Socket auf Port 80<br />
erstellt.<br />
StartListening und StopListening</p>
<pre><code class="language-cpp">void CIsrvBSPApp::StartListening(void)
{
	StopListening ();

	m_pListen = new CListenSocket ();
	if (m_pListen) {
		if (m_pListen-&gt;Create (80, SOCK_STREAM, FD_ACCEPT))
			m_pListen-&gt;Listen ();
	}
}

void CIsrvBSPApp::StopListening(void)
{
	if (m_pListen) {
		m_pListen-&gt;Close ();
		delete m_pListen;
		m_pListen = NULL;
	}
}
</code></pre>
<p>StopListening wird beim beenden des Programmes aufgerufen.</p>
<p>Die Klasse CListenSocket:</p>
<pre><code class="language-cpp">//Header
#pragma once
#include &quot;stdafx.h&quot;
#include &quot;RequestSocket.h&quot;

class CListenSocket :
	public CAsyncSocket
{
public:
	CListenSocket(void);
	virtual void OnAccept (int nErrorCode);
	~CListenSocket(void);
};
</code></pre>
<pre><code class="language-cpp">//Implementierungsdatei
#include &quot;StdAfx.h&quot;
#include &quot;.\listensocket.h&quot;

CListenSocket::CListenSocket(void)
{
}

CListenSocket::~CListenSocket(void)
{
}

void CListenSocket::OnAccept (int nErrorCode) {

	CRequestSocket *pRequest = new CRequestSocket ();
	if (Accept (*pRequest)) {
		pRequest-&gt;AsyncSelect (FD_READ | FD_CLOSE);
	}
}
</code></pre>
<p>Die Klasse CRequestSocket</p>
<pre><code class="language-cpp">//Header
#pragma once
#include &quot;afxsock.h&quot;
#include &lt;cstring&gt;

const int m_BufSize = 1024;
const char m_header[] = &quot;HTTP/1.0 200 OK\r\n&quot;
&quot;Server: Mein erster Server\r\n&quot;
&quot;Date: Mon, 24 Oktober 2001 12:00:00 GTM\r\n&quot;
&quot;Content-Type: text/html\r\n&quot;
&quot;Accept-Ranges: bytes\r\n&quot;
&quot;Content-Length: 10\r\n&quot;
&quot;\r\n&quot;;
class CRequestSocket :
	public CAsyncSocket
{
public:
	CRequestSocket(void);
	~CRequestSocket(void);

	virtual void OnReceive (int nErrorCode);
	virtual void OnSend (int nErrorCode);
private:

	char m_buffer[m_BufSize];
};
</code></pre>
<pre><code class="language-cpp">//Implementierungsdatei
#include &quot;StdAfx.h&quot;
#include &quot;.\requestsocket.h&quot;

CRequestSocket::CRequestSocket(void)
{
}

CRequestSocket::~CRequestSocket(void)
{
}

void CRequestSocket::OnReceive (int nErrorCode)
{
	Receive (m_buffer, m_BufSize);

	std::strcpy (m_buffer, m_header);
	std::strcpy (m_buffer+strlen (m_header), &quot;Hallo Welt&quot;);
	AsyncSelect (FD_WRITE | FD_CLOSE);
}

void CRequestSocket::OnSend (int nErrorCode)
{
	Send (m_buffer, std::strlen (m_header + std::strlen (&quot;Hallo Welt&quot;)));
	ShutDown (both);
	delete this;
}
</code></pre>
<p>Nun die Frage, weshalb wird nichts versendet?</p>
<p>Danke für eure Mühe <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/490595</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/490595</guid><dc:creator><![CDATA[SirLant]]></dc:creator><pubDate>Sun, 28 Mar 2004 17:43:37 GMT</pubDate></item><item><title><![CDATA[Reply to Einfacher HTTP Server, sendet keine Daten on Sun, 28 Mar 2004 18:13:03 GMT]]></title><description><![CDATA[<p>hallo</p>
<p>habe vor jahren einen ähnlichen server gebastelt.. sieht gut aus..</p>
<p>schau mal, ob du dir ein wenig mit messageboxen einige sachen ausgeben kannst, zum fehlersuchen..</p>
<p>erweitere die onAccept mal um das ausgeben der ip des rechners, der angefragt hat, dann weißt du, ob du &quot;gehört&quot; wirst..</p>
<p>er gibt dir die auflösung von localhost, die 127.0.0.1</p>
<pre><code class="language-cpp">void CListenSocket::OnAccept(int nErrorCode)
{
	CRequestSocket* pRequest=new CRequestSocket;
	if (Accept (*pRequest)){

		//bekomme die Ip des verbundenen Computers
		CString PeerAddress;
		UINT PeerPort=0;
		pRequest-&gt;GetPeerName(PeerAddress,PeerPort );

		//ist diese Messagebox aktiviert, die eingehende IpNummer des anfragenden
		//Computers eingesehen werden
		AfxMessageBox (PeerAddress);

....
.....
....
</code></pre>
<p>das gleiche würde ich auch in onSend und onReceive versuchen... also mit den messageboxen mal schaun, ob die daten wirklich im buffer sind und gesendet werden..</p>
<p>bis hierhin erstmal...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/490614</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/490614</guid><dc:creator><![CDATA[elise]]></dc:creator><pubDate>Sun, 28 Mar 2004 18:13:03 GMT</pubDate></item><item><title><![CDATA[Reply to Einfacher HTTP Server, sendet keine Daten on Sun, 28 Mar 2004 18:40:23 GMT]]></title><description><![CDATA[<p>In der MessageBox aus OnAccept steht &quot;127.0.0.1&quot;, also wird richtig aufgelöst<br />
und die MessageBox poppt auf sobald ich die Anfrage über den Browser losschicke.</p>
<p>Habe die Funktion OnReceive wie folgt geändert:</p>
<pre><code class="language-cpp">void CRequestSocket::OnReceive (int nErrorCode)
{
	Receive (m_buffer, m_BufSize);

	CString rec (m_buffer); // &lt;---
	AfxMessageBox (rec); // &lt;----

	std::strcpy (m_buffer, m_header);
	std::strcpy (m_buffer+strlen (m_header), &quot;Hallo Welt&quot;);
	AsyncSelect (FD_WRITE | FD_CLOSE);
}
</code></pre>
<p>Die MessageBox, gibt folgendes aus: <a href="http://www.programminghints.de/http_server/receive.jpg" rel="nofollow">http://www.programminghints.de/http_server/receive.jpg</a></p>
<p>Dann habe ich die Funktion OnReceive wie folgt geändert:</p>
<pre><code class="language-cpp">void CRequestSocket::OnReceive (int nErrorCode)
{
	Receive (m_buffer, m_BufSize);

	CString rec (m_buffer);
	AfxMessageBox (rec);

	std::strcpy (m_buffer, m_header);
	std::strcpy (m_buffer+strlen (m_header), &quot;Hallo Welt&quot;);
	rec = m_buffer; // &lt;-----
	AfxMessageBox (rec); // &lt;-----
	AsyncSelect (FD_WRITE | FD_CLOSE);
}
</code></pre>
<p>Die MessageBox gibt folgendes aus: <a href="http://www.programminghints.de/http_server/receive2.jpg" rel="nofollow">http://www.programminghints.de/http_server/receive2.jpg</a></p>
<p>Die Daten in OnSend sind die gleichen wie auf dem Bild <a href="http://www.programminghints.de/http_server/receive2.jpg" rel="nofollow">http://www.programminghints.de/http_server/receive2.jpg</a><br />
zu sehen ist.</p>
<p>Also die Daten stimmen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/490631</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/490631</guid><dc:creator><![CDATA[SirLant]]></dc:creator><pubDate>Sun, 28 Mar 2004 18:40:23 GMT</pubDate></item><item><title><![CDATA[Reply to Einfacher HTTP Server, sendet keine Daten on Sun, 28 Mar 2004 21:45:38 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>SirLant schrieb:</p>
<blockquote>
<p>Die Daten in OnSend sind die gleichen wie auf dem Bild <a href="http://www.programminghints.de/http_server/receive2.jpg" rel="nofollow">http://www.programminghints.de/http_server/receive2.jpg</a><br />
zu sehen ist.</p>
</blockquote>
<p>wo hast du das überprüft? Bis zu dieser Zeile:</p>
<pre><code class="language-cpp">Send (m_buffer, std::strlen (m_header + std::strlen (&quot;Hallo Welt&quot;)));
</code></pre>
<p>mag der Wert in m_buffer ja noch stimmen, aber durch diese (für mich etwas unverständliche) Berechnung der Puffer-Länge:</p>
<p>std::strlen (m_header + std::strlen (&quot;Hallo Welt&quot;))</p>
<p>der zu sendenden Daten wird dafür gesorgt, daß gerade der Content, nämlich der &quot;Hallo Welt&quot;-Text, nicht mitgesendet wird... <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="😕"
    /> , also irgendwie seltsam der Quell-Text...richtig(er) wäre m.E. das hier:</p>
<pre><code class="language-cpp">Send (m_buffer, std::strlen (m_header) + std::strlen (&quot;Hallo Welt&quot;));
</code></pre>
<p>da du in deiner Eingangsfrage von &quot;Abtippen&quot; gesprochen hast: vielleicht ein (Ab-)Tippfehler, aber das fällt wohl weg, wenn auch die CD-Version nicht läuft.</p>
<p>Probier's mal, ansonsten ist eine Fehlerbehandlung fällig (in OnSend kommt der Server ja, wenn ich dich richtig verstanden habe, dann Überprüfen des Rückgabe-Wertes von Send, anschließendes GetLastError, das übliche eben...)</p>
<p>MfG</p>
]]></description><link>https://www.c-plusplus.net/forum/post/490707</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/490707</guid><dc:creator><![CDATA[Probe-Nutzer]]></dc:creator><pubDate>Sun, 28 Mar 2004 21:45:38 GMT</pubDate></item><item><title><![CDATA[Reply to Einfacher HTTP Server, sendet keine Daten on Mon, 29 Mar 2004 12:41:30 GMT]]></title><description><![CDATA[<p>Ok das mit strlen macht für mich jetzt wo du es erwähnst ebenfalls keinen Sinn,<br />
ich werd mal deine alternative Version testen, welche sicher zu dem richtigen<br />
Ergebnis führt <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>
<p>Edit:</p>
<p>Jetzt geht es <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/490945</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/490945</guid><dc:creator><![CDATA[SirLant]]></dc:creator><pubDate>Mon, 29 Mar 2004 12:41:30 GMT</pubDate></item></channel></rss>