<?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[verständnisproblem sockets]]></title><description><![CDATA[<p>hallo,</p>
<p>ich hab anhand diverser tutorials mal versucht ein bissl mit sockets herum zu spielen. aber irgendwie hab ich noch diverse verständnisprobleme was die sache angeht.<br />
also was ich hab ist ein server, der an einem port lauscht, und folgendes Protokoll benutzt:</p>
<pre><code class="language-cpp">dta_Server = socket(AF_INET,           // Go over TCP/IP
                    SOCK_STREAM,       //This is a stream-oriented socket
                    IPPROTO_TCP);
</code></pre>
<p>dann mache ich einen asynchronen socket daraus:</p>
<pre><code class="language-cpp">// Make socket async socket
nret = WSAAsyncSelect(dta_Server, hWnd, DTA_SOCKET_MESSAGE, REPORTED_SOCKET_EVENTS);
</code></pre>
<p>und kann auch in meiner WNDPROC prima mittels der empfangenen Messages auf Ereignisse reagieren. Eine Verbindung mit Hyperterminal (Client) kommt zu stande und auch Daten werden empfangen (vom Server).</p>
<p>Nun aber zu meinen Fragen:</p>
<p>1. Ich würde gerne Daten einer definierten Paketgröße verschicken, z.B. 1024 bytes, die dann ein struct darstellen z.B. sowas</p>
<pre><code class="language-cpp">struct PAKET
{
	DWORD	PacketType;
	DWORD	res1;
	DWORD	res2;
	char	PacketData[1012];
};
</code></pre>
<p>und auf der anderen Seite auch so empfangen. Gibt es da Mittel und wege?<br />
Wenn ich z.B. 1024 zeichen mittels Hyperterminal übertrage, kommen die in mehreren Paketen unterschiedlicher/zufälliger Größe an. Manchmal kommen sogar 1 byte Pakete. Liegt das daran dass mein Server asynchron arbeitet?<br />
Würde ich, wenn ich blockierend lesen würde dann das komplette Paket am Stück empfangen? Ich glaube nicht unbedingt oder? Weil MSDN sacht das:</p>
<blockquote>
<p>For connection-oriented sockets (type SOCK_STREAM for example), calling recv will return as much information as is currently available—up to the size of the buffer specified</p>
</blockquote>
<p>2. Wie kann ich es realisieren, dass ich über eine &quot;Leitung&quot; Senden UND Empfangen kann? Also eine Art simples Protokoll implementieren. Sollte ich dazu blockierendes Lesen verwenden und zum Bsp auf Client Seite immer abwechselnd Schreiben und danach Lesen (sozusagen schauen was der Server antwortet)? Aber falls ja, wie kann ich dann sicher stellen, dass ich auch alles vom Server erhalten hab? Soll ich auf Client-Seite mit dem Flag MSG_PEEK solange in einer Schleife warten, bis die 1024 bytes anliegen?</p>
<p>3. Ist von Protokollebene her gesichert, dass die Daten auch in der Reihenfolge ankommen wie ich sie Sende?</p>
<p>...so ich denke das reicht erst mal. Wäre Prima wenn jemand ein paar brauchbare Tipps hat, oder einen guten Link. Weil alle Tutorials die ich finde immer nur so an der Oberfläche rumkratzen und die allernötigsten Basic bringen. Aber bis zu so einer Art &quot;Protokoll&quot; ist es ja doch noch eine Ecke hin und da wollt ich einfach mal von Euch wissen, wie man es RICHTIG macht bevor ich wieder anfange rumzupfuschen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/103504/verständnisproblem-sockets</link><generator>RSS for Node</generator><lastBuildDate>Fri, 01 May 2026 15:21:16 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/103504.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 09 Mar 2005 10:52:06 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to verständnisproblem sockets on Wed, 09 Mar 2005 10:52:06 GMT]]></title><description><![CDATA[<p>hallo,</p>
<p>ich hab anhand diverser tutorials mal versucht ein bissl mit sockets herum zu spielen. aber irgendwie hab ich noch diverse verständnisprobleme was die sache angeht.<br />
also was ich hab ist ein server, der an einem port lauscht, und folgendes Protokoll benutzt:</p>
<pre><code class="language-cpp">dta_Server = socket(AF_INET,           // Go over TCP/IP
                    SOCK_STREAM,       //This is a stream-oriented socket
                    IPPROTO_TCP);
</code></pre>
<p>dann mache ich einen asynchronen socket daraus:</p>
<pre><code class="language-cpp">// Make socket async socket
nret = WSAAsyncSelect(dta_Server, hWnd, DTA_SOCKET_MESSAGE, REPORTED_SOCKET_EVENTS);
</code></pre>
<p>und kann auch in meiner WNDPROC prima mittels der empfangenen Messages auf Ereignisse reagieren. Eine Verbindung mit Hyperterminal (Client) kommt zu stande und auch Daten werden empfangen (vom Server).</p>
<p>Nun aber zu meinen Fragen:</p>
<p>1. Ich würde gerne Daten einer definierten Paketgröße verschicken, z.B. 1024 bytes, die dann ein struct darstellen z.B. sowas</p>
<pre><code class="language-cpp">struct PAKET
{
	DWORD	PacketType;
	DWORD	res1;
	DWORD	res2;
	char	PacketData[1012];
};
</code></pre>
<p>und auf der anderen Seite auch so empfangen. Gibt es da Mittel und wege?<br />
Wenn ich z.B. 1024 zeichen mittels Hyperterminal übertrage, kommen die in mehreren Paketen unterschiedlicher/zufälliger Größe an. Manchmal kommen sogar 1 byte Pakete. Liegt das daran dass mein Server asynchron arbeitet?<br />
Würde ich, wenn ich blockierend lesen würde dann das komplette Paket am Stück empfangen? Ich glaube nicht unbedingt oder? Weil MSDN sacht das:</p>
<blockquote>
<p>For connection-oriented sockets (type SOCK_STREAM for example), calling recv will return as much information as is currently available—up to the size of the buffer specified</p>
</blockquote>
<p>2. Wie kann ich es realisieren, dass ich über eine &quot;Leitung&quot; Senden UND Empfangen kann? Also eine Art simples Protokoll implementieren. Sollte ich dazu blockierendes Lesen verwenden und zum Bsp auf Client Seite immer abwechselnd Schreiben und danach Lesen (sozusagen schauen was der Server antwortet)? Aber falls ja, wie kann ich dann sicher stellen, dass ich auch alles vom Server erhalten hab? Soll ich auf Client-Seite mit dem Flag MSG_PEEK solange in einer Schleife warten, bis die 1024 bytes anliegen?</p>
<p>3. Ist von Protokollebene her gesichert, dass die Daten auch in der Reihenfolge ankommen wie ich sie Sende?</p>
<p>...so ich denke das reicht erst mal. Wäre Prima wenn jemand ein paar brauchbare Tipps hat, oder einen guten Link. Weil alle Tutorials die ich finde immer nur so an der Oberfläche rumkratzen und die allernötigsten Basic bringen. Aber bis zu so einer Art &quot;Protokoll&quot; ist es ja doch noch eine Ecke hin und da wollt ich einfach mal von Euch wissen, wie man es RICHTIG macht bevor ich wieder anfange rumzupfuschen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/741202</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/741202</guid><dc:creator><![CDATA[hanabasta]]></dc:creator><pubDate>Wed, 09 Mar 2005 10:52:06 GMT</pubDate></item><item><title><![CDATA[Reply to verständnisproblem sockets on Wed, 09 Mar 2005 11:11:24 GMT]]></title><description><![CDATA[<p>1. Du musst halt eine Schleife machen, die so lange liest, bis die 1024 Bytes vollständig sind.</p>
<p>2. Ist eigentlich kein Problem. Normalerweise schickt der Server erst was, nachdem der Client eine Anfrage gestellt hat, es wird also immer abwechselnd auf den jeweils anderen gewartet. Und man weiß aufgrund irgendwelcher Regeln, wann die Nachricht der Gegenseite zu Ende ist.</p>
<p>3. Ja.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/741222</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/741222</guid><dc:creator><![CDATA[Ringding]]></dc:creator><pubDate>Wed, 09 Mar 2005 11:11:24 GMT</pubDate></item></channel></rss>