<?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[Verwirrung um winsock mit struct und pointer]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich bin ein bisschen verwirrt bezüglich der Winsock Kommunikation und dem Speichern bzw. Lesen der Daten in bzw aus einer Struktur.</p>
<p>Ich habe eine data.h mit den zwei Strukturen:</p>
<p>data.h</p>
<pre><code class="language-cpp">...
struct request {
	unsigned char  ReqType;	
#define ReqNone 0
#define ReqBook 'B'
#define ReqStorn 'S'
	unsigned       FlNr;	/* Flight Number */
	unsigned       SeNr;	/* Seat Number (== 0) no Special Seat */
	char           name[32];
	struct ExpSeat SeatWanted;	/* Type of Seat wanted */
};

struct answer {
        unsigned char AnswType;
#define AnswNone 0
#define AnswOk   'O'
#define AnswWarn 'W'	/* example: Seat not available */
#define AnswErr  0xFF
	unsigned       FlNr;
	unsigned   SeNo;
#define ErrNo SeNo	/* Are identical */
};
</code></pre>
<p>Weiterhin habe ich in der Server Datei folgendes</p>
<p>server.c</p>
<pre><code class="language-cpp">#include &lt;data.h&gt;
...
//Prototypen
static struct request req;
...
struct request *getRequest() {
  ...
  long rc; 
  // Verbindung annehmen
  rc=accept(s,NULL,NULL);
  while (1){
// Warte am Socket auf Daten und speichere sie in req ab
    recv(s,(char *)&amp;req, sizeof(struct request), 0);
   {
      printf (&quot;error recvfrom&quot;);
      return(0);
    };
      return(&amp;req);
  }
};

int sendAnswer(struct answer *answ) {
// Schreibe die uebergebene Antwort answ an das Socket ***/
 send(s,(char *)&amp;answ,sizeof(struct answer),0);
 return(1);
};
</code></pre>
<p>und in der Client Daten folgendes:</p>
<p>client.c</p>
<pre><code class="language-cpp">#include &lt;data.h&gt;;
...
//Prototypen
static struct answer answ;
...
struct answer *DoRequest(struct request *req) {
...
// Schreibe in das Socket die Anfrage req 
  send(s,(char *)&amp;req,sizeof(struct request),0);
  while (1){
// Lese die Antwort vom Socket und speichere sie in answ ab 
    recv(s,(char *)&amp;answ,sizeof(struct answer),0);
    {
     printf (&quot;error recvfrom&quot;);
     return(0);
    };
   break;
  }
//schließe Socket
  closesocket(s);
  return(&amp;answ);
};
</code></pre>
<p>Der Compiler läuft ohne Probleme durch und ich kann den Server (server.exe) starten. Winsock wird gestartet, der Socket wird erstellt und an den Port gebunden und er geht in den listen Mode.<br />
Wenn ich dann aber den Client starte wird bei ihm auch Winsock gestartet, der Socket erstellt und er verbindet sich mit dem Server.<br />
Sofort danach bekomme ich vom Debugger die Fehlermeldung: Unbehandelte Ausnahme bei 0x0042ed11 in server.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x00000000.</p>
<p>Ich denke das irgendwas mit dem recv(..) und dem send(..) und dem speichern/lesen aus der Structur nicht funktioniert. Ich sehe leider nicht was!</p>
<p>Hat jemand eine Ahnung?</p>
<p>Danke,</p>
<p>Andreas</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/183863/verwirrung-um-winsock-mit-struct-und-pointer</link><generator>RSS for Node</generator><lastBuildDate>Wed, 23 Sep 2026 12:37:27 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/183863.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 09 Jun 2007 16:13:00 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Verwirrung um winsock mit struct und pointer on Sat, 09 Jun 2007 16:16:18 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich bin ein bisschen verwirrt bezüglich der Winsock Kommunikation und dem Speichern bzw. Lesen der Daten in bzw aus einer Struktur.</p>
<p>Ich habe eine data.h mit den zwei Strukturen:</p>
<p>data.h</p>
<pre><code class="language-cpp">...
struct request {
	unsigned char  ReqType;	
#define ReqNone 0
#define ReqBook 'B'
#define ReqStorn 'S'
	unsigned       FlNr;	/* Flight Number */
	unsigned       SeNr;	/* Seat Number (== 0) no Special Seat */
	char           name[32];
	struct ExpSeat SeatWanted;	/* Type of Seat wanted */
};

struct answer {
        unsigned char AnswType;
#define AnswNone 0
#define AnswOk   'O'
#define AnswWarn 'W'	/* example: Seat not available */
#define AnswErr  0xFF
	unsigned       FlNr;
	unsigned   SeNo;
#define ErrNo SeNo	/* Are identical */
};
</code></pre>
<p>Weiterhin habe ich in der Server Datei folgendes</p>
<p>server.c</p>
<pre><code class="language-cpp">#include &lt;data.h&gt;
...
//Prototypen
static struct request req;
...
struct request *getRequest() {
  ...
  long rc; 
  // Verbindung annehmen
  rc=accept(s,NULL,NULL);
  while (1){
// Warte am Socket auf Daten und speichere sie in req ab
    recv(s,(char *)&amp;req, sizeof(struct request), 0);
   {
      printf (&quot;error recvfrom&quot;);
      return(0);
    };
      return(&amp;req);
  }
};

int sendAnswer(struct answer *answ) {
// Schreibe die uebergebene Antwort answ an das Socket ***/
 send(s,(char *)&amp;answ,sizeof(struct answer),0);
 return(1);
};
</code></pre>
<p>und in der Client Daten folgendes:</p>
<p>client.c</p>
<pre><code class="language-cpp">#include &lt;data.h&gt;;
...
//Prototypen
static struct answer answ;
...
struct answer *DoRequest(struct request *req) {
...
// Schreibe in das Socket die Anfrage req 
  send(s,(char *)&amp;req,sizeof(struct request),0);
  while (1){
// Lese die Antwort vom Socket und speichere sie in answ ab 
    recv(s,(char *)&amp;answ,sizeof(struct answer),0);
    {
     printf (&quot;error recvfrom&quot;);
     return(0);
    };
   break;
  }
//schließe Socket
  closesocket(s);
  return(&amp;answ);
};
</code></pre>
<p>Der Compiler läuft ohne Probleme durch und ich kann den Server (server.exe) starten. Winsock wird gestartet, der Socket wird erstellt und an den Port gebunden und er geht in den listen Mode.<br />
Wenn ich dann aber den Client starte wird bei ihm auch Winsock gestartet, der Socket erstellt und er verbindet sich mit dem Server.<br />
Sofort danach bekomme ich vom Debugger die Fehlermeldung: Unbehandelte Ausnahme bei 0x0042ed11 in server.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x00000000.</p>
<p>Ich denke das irgendwas mit dem recv(..) und dem send(..) und dem speichern/lesen aus der Structur nicht funktioniert. Ich sehe leider nicht was!</p>
<p>Hat jemand eine Ahnung?</p>
<p>Danke,</p>
<p>Andreas</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1302089</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1302089</guid><dc:creator><![CDATA[andjanbru]]></dc:creator><pubDate>Sat, 09 Jun 2007 16:16:18 GMT</pubDate></item><item><title><![CDATA[Reply to Verwirrung um winsock mit struct und pointer on Sat, 09 Jun 2007 21:38:03 GMT]]></title><description><![CDATA[<p>Versuche mal mit Debuggen heraus zu finden wo das passiert.<br />
Außerdem sieht das sehr stark nach reinem C aus.</p>
<p>mfg.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1302238</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1302238</guid><dc:creator><![CDATA[joomoo]]></dc:creator><pubDate>Sat, 09 Jun 2007 21:38:03 GMT</pubDate></item><item><title><![CDATA[Reply to Verwirrung um winsock mit struct und pointer on Sat, 09 Jun 2007 22:05:27 GMT]]></title><description><![CDATA[<p>Hi !</p>
<p>Die Funktion send hätte gern als zweiten Paramter den Typ:<br />
const char FAR * buf,<br />
und die Funktion recv gibt sich mit einem char FAR * buf zufrieden.<br />
Weil deine Parameter vom Typ static struct und als char* gecastet sind, geht das schief.</p>
<p>Edit: Um in der Zeile 13 einen Namen empfangen zu können, müsste der Aufruf so aussehen:<br />
recv(s, <a href="http://req.name" rel="nofollow">req.name</a>, sizeof(<a href="http://req.name" rel="nofollow">req.name</a>), 0);</p>
<p>Gruß,<br />
p.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1302241</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1302241</guid><dc:creator><![CDATA[proggingmania]]></dc:creator><pubDate>Sat, 09 Jun 2007 22:05:27 GMT</pubDate></item><item><title><![CDATA[Reply to Verwirrung um winsock mit struct und pointer on Sun, 10 Jun 2007 08:55:25 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>danke erstmal für die Antworten.<br />
Wie kann ich es bewerkstelligen das der ganze Inhalt der Struktur empfangen wird und nicht nur der Name?</p>
<p>Dnake,</p>
<p>Andreas</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1302316</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1302316</guid><dc:creator><![CDATA[andjanbru]]></dc:creator><pubDate>Sun, 10 Jun 2007 08:55:25 GMT</pubDate></item><item><title><![CDATA[Reply to Verwirrung um winsock mit struct und pointer on Sun, 10 Jun 2007 11:21:40 GMT]]></title><description><![CDATA[<p>Für die komplette Struktur kannst du es mit deiner cast- Methode machen,<br />
wenn du für genug Puffer sorgst.</p>
<p>Der dritte Parameter in deiner recv Funktion z.B. berücksichtigt nicht, das in der Struktur struct request noch eine weitere Struktur enthalten ist, nämlich<br />
struct ExpSeat.</p>
<p>Darum müsstest du den dritten Parameter erweitern:<br />
... ,sizeof(struct request) + sizeof( struct ExpSeat ), ; ...</p>
<p>Die defines kannst du aus deinen Strukturen rausschmeissen und global definieren, weil sie sich nicht kapseln lassen und auch nicht übertragen werden.<br />
Sie haben keinen Einfluss auf die Größe der Strukturen.</p>
<p>Grüße,<br />
p.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1302372</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1302372</guid><dc:creator><![CDATA[proggingmania]]></dc:creator><pubDate>Sun, 10 Jun 2007 11:21:40 GMT</pubDate></item><item><title><![CDATA[Reply to Verwirrung um winsock mit struct und pointer on Sun, 10 Jun 2007 12:01:54 GMT]]></title><description><![CDATA[<p>proggingmania schrieb:</p>
<blockquote>
<p>Hi !</p>
<p>Die Funktion send hätte gern als zweiten Paramter den Typ:<br />
const char FAR * buf,<br />
und die Funktion recv gibt sich mit einem char FAR * buf zufrieden.<br />
Weil deine Parameter vom Typ static struct und als char* gecastet sind, geht das schief.</p>
</blockquote>
<p>static heisst hier: nur in dieser Uebersetzungseinheit sichtbar, d. h. auf req<br />
kann nicht aus anderen Uebersetzungseinheiten aus zugegriffen werden.</p>
<blockquote>
<p>Edit: Um in der Zeile 13 einen Namen empfangen zu können, müsste der Aufruf so aussehen:<br />
recv(s, <a href="http://req.name" rel="nofollow">req.name</a>, sizeof(<a href="http://req.name" rel="nofollow">req.name</a>), 0);</p>
</blockquote>
<p>Er sendet aber die ganze Struktur 'request'. Was will er dann mit mit Daten<br />
in 'name'?</p>
<p>proggingmania schrieb:</p>
<blockquote>
<p>Für die komplette Struktur kannst du es mit deiner cast- Methode machen,<br />
wenn du für genug Puffer sorgst.</p>
</blockquote>
<p>Er hat ja genug Puffer, denn er hat ja eine Instanz von req erzeugt.</p>
<blockquote>
<p>Der dritte Parameter in deiner recv Funktion z.B. berücksichtigt nicht, das in der Struktur struct request noch eine weitere Struktur enthalten ist, nämlich<br />
struct ExpSeat.</p>
<p>Darum müsstest du den dritten Parameter erweitern:<br />
... ,sizeof(struct request) + sizeof( struct ExpSeat ), ; ...</p>
</blockquote>
<p>Nein das musst du natuerlich nicht. Die Groesse innerer Strukturen wird korrekt<br />
in die Berechnung mit einbezogen. Dieses Problem haettest du nur, wenn<br />
SeatWanted ein Zeiger waere.</p>
<blockquote>
<p>Die defines kannst du aus deinen Strukturen rausschmeissen und global definieren, weil sie sich nicht kapseln lassen und auch nicht übertragen werden.<br />
Sie haben keinen Einfluss auf die Größe der Strukturen.</p>
</blockquote>
<p>Definiere &quot;uebertragen werden&quot;. Ansonsten ist es natuerlich korrekt. Aber man<br />
&quot;sieht&quot; hiermit eine gewisse Zugehoerigkeit der Defines. Allerdings nur, wenn<br />
man sich die Deklaration anschaut, im Quellcode selber geht sie verloren.</p>
<blockquote>
<pre><code class="language-cpp">while (1){
// Warte am Socket auf Daten und speichere sie in req ab
    recv(s,(char *)&amp;req, sizeof(struct request), 0);
   {
      printf (&quot;error recvfrom&quot;);
      return(0);
    };
      return(&amp;req);
  }
</code></pre>
</blockquote>
<p>Schau dir den Code mal genau an. Wann geht er in den inneren Block rein und<br />
was gibt er in diesem Falle zurueck? Was passiert danach mit dem Rueckgabewert?<br />
Versuchst du auf diesen zuzugreifen? In client.c tust du das uebrigens auch.<br />
Sieht nach einer vergessenen if-Bedingung aus.</p>
<p>Lass den Code mal im Debug-Modus laufen und mach einen Backtrace.</p>
<p>gruss<br />
v R</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1302385</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1302385</guid><dc:creator><![CDATA[virtuell Realisticer]]></dc:creator><pubDate>Sun, 10 Jun 2007 12:01:54 GMT</pubDate></item><item><title><![CDATA[Reply to Verwirrung um winsock mit struct und pointer on Sun, 10 Jun 2007 12:22:45 GMT]]></title><description><![CDATA[<p>virtuell Realisticer schrieb:</p>
<blockquote>
<p>Nein das musst du natuerlich nicht. Die Groesse innerer Strukturen wird korrekt<br />
in die Berechnung mit einbezogen. Dieses Problem haettest du nur, wenn<br />
SeatWanted ein Zeiger waere.</p>
</blockquote>
<p>Ja, stimmt, sorry.<br />
Die Zeile</p>
<pre><code>recv(s,(char *)&amp;req, sizeof(struct request), 0);
</code></pre>
<p>ist also durchaus korrekt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1302399</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1302399</guid><dc:creator><![CDATA[proggingmania]]></dc:creator><pubDate>Sun, 10 Jun 2007 12:22:45 GMT</pubDate></item></channel></rss>