<?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[Frage zu Socket-Programmierung und select()]]></title><description><![CDATA[<p>Hallo<br />
Ich habe ein Problem. Es geht um folgendes:<br />
Ich soll im Rahmen meines Studiums eine Client-Server-Anwendung in C/C++ schreiben. Es soll möglich sein mehrere Clients gleichzeitig mittels select() zu bedienen.<br />
Mein Problem ist nun, dass ich einen Client connecte. Von diesem schicke ich einen Text an den Server und der wiederum an den Client als Bestätigung. Meine Server-Schleife wird dabei 2x durchlaufen. Der Puffer für die empfangene Nachricht vom Client enthält auch nach dem leeren des Puffers die geschickte Nachricht. Beim 3. Durchlauf allerdings kommt es zu einem Fehler aber ich weiß nicht warum.<br />
Wenn einer eine Ahnung hat woran es liegt wäre mir sehr geholfen.<br />
Danke schonmal</p>
<pre><code class="language-cpp">// RN_P_Beispielserver.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung.
//
#include &quot;stdafx.h&quot;
#include &lt;stdio.h&gt;
//#include &lt;winsock.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;io.h&gt;
#include &lt;conio.h&gt;

#ifdef _WIN32
#include &lt;winsock.h&gt;
#include &lt;io.h&gt;
#endif

#define PROTOPORT		5000    // Default Portnummer
#define QLEN			6       // Länge der Backlog-Warteschlange
#define AF_INET_LEN		4		// Länge der IPv4-Adresse in Byte
#define RECVBUF_SIZE	100	// Größe des Empfangspuffers
#define SENDBUF_SIZE	100	// Größe des Sendepuffers
#define MAXCLIENT		5

int main(int argc, char* argv[])
{
//---------------------------------------------------------------------------------
// Program:   RN_P_Beispielserver.cpp
//
// Funktion:  Erzeugt einen Socket und führt die folgenden Aktionen zyklisch aus:
//            (1) Wartet auf eingehende Verbindungswünsche von Clients
//            (2) Führe passiven TCP-Verbindungsaufbau durch
//	          (3) Sende eine Nachricht an den Client
//            (4) Schließe die TCP-Verbindung
//            (5) Gehe zurück zu Schritt (1)
//			   
// Aufruf:    RN_P_Beispielserver [&lt;Portnummer&gt;]
//            &lt;Portnummer&gt;: Portnummer unter welcher der Server seinen 
//							Dienst anbietet		
//
// Bemerkung: Die Eingabe der Portnummer ist optional. Falls kein Port spezifiziert
//			  ist, wird der durch PROTOPORT definierte Default-Wert verwendet!    
//
// Dr. W. Schmitt, 06.05.08
//---------------------------------------------------------------------------------

	const char *Datum = &quot;06.05.08&quot;;
    int		Fehlerkode;		// Hilfsvariable zum Speichern eines Fehlerkodes
	protoent *ptrp;			// Speichert den Namen des Transp.Protok.--&gt; winsock.h
	sockaddr_in serveradress;		// Speichert die Serveradresse --&gt; winsock.h
    sockaddr_in clientadress;		// Speichert die Clientadresse --&gt; winsock.h
    SOCKET  fd,		// Socketdeskriptor --&gt; Annahme ank. Verbindungen
			sd_client;      // Socketdeskriptor --&gt; Aktive Clientverbindungen
    unsigned short	port;	// Portnummer des Servers
    int     struct_size;    // Größe einer Datenstruktur
    int		string_len;		// Länge einer Zeichenkette
	int	n;				// Anzahl empfangener Bytes
	char	RecvBuf[RECVBUF_SIZE];	// Puffer für Empfangsdaten
	char    SendBuf[SENDBUF_SIZE];  // Puffer für Sendedaten
	//int     visits = 0;		// Zählt die Anzahl erfolgreicher Clientverbindungen
	WSADATA	wsaData;		// Speichert Winsock-Initialisierungsinfo
    WORD wVersionRequested;	// Speichert die gewünschte Version der Winsock-DLL

	// Variablen für Select()
	int clcnt = 0;		// Aktuelle Anzahl von Verbindungen
	SOCKET	clients[MAXCLIENT];		// Socketdescriptor: Client-Server Datenaustausch
	fd_set ReadSet;			// Enthält Sockets deren Lesestatus überwacht
							// werden soll
	long rc;
	TIMEVAL time;

	int i;

	wVersionRequested = MAKEWORD(2, 2);
	// Initialisierung der Winsock-DLL	
	Fehlerkode = WSAStartup(wVersionRequested, &amp;wsaData);
	if (Fehlerkode != NO_ERROR)
	{
		fprintf_s(stdout,&quot;Initialisierung der Winsock-DLL fehlgeschlagen: %i\n&quot;,
					Fehlerkode);
	} 

	//  Bildschirmausgabe einer Begrüßungsnachricht     	
	fprintf_s(stdout, &quot;Server gestartet\nWarte auf Clients\n&quot;);

	memset(&amp;serveradress, 0, sizeof(serveradress));       // Initialisiere sad mit 0
	serveradress.sin_family = AF_INET;           // Setze &quot;Internetadressierung&quot;
    serveradress.sin_addr.s_addr = INADDR_ANY;   //

	// Auswerten der Kommandozeilenparameter

	// Falls &lt;Portnummer&gt; vorhanden
	if (argc &gt; 1) 
	{	
		// dann konvertiere nach int				
		port = atoi(argv[1]);
	}		
    else 
	{
		// sonst verwende Default-Wert
		port = PROTOPORT;
	}			

    if (port &gt; 0)
	{
        serveradress.sin_port = htons(port); // Host --&gt; Netzwerk-Byteordnung
	}
    else 
	{                          // Drucke Fehlermeldung; Programmende
         fprintf(stdout,&quot;Ungültige Portnummer %s\n&quot;,argv[1]);
		 WSACleanup();
		 exit(EXIT_FAILURE);
	}

    if ((ptrp = getprotobyname(&quot;tcp&quot;)) == NULL)
	{ // &quot;tcp&quot; --&gt; Protokollcode
        fprintf(stdout, &quot;Abbildung von \&quot;tcp\&quot; auf Protokollnummer nicht möglich!&quot;);
		WSACleanup();
		exit(EXIT_FAILURE);
	}

	// Erzeuge Socket
    fd = socket(PF_INET, SOCK_STREAM, ptrp-&gt;p_proto);
    if (fd == INVALID_SOCKET)
	{
		fprintf_s(stdout, &quot;Fehler bei Generierung von Socket: %ld\n&quot;, WSAGetLastError());
		WSACleanup();
		exit(EXIT_FAILURE);
	}

	// Initialisiere Socket mit (Rechneradress, Portnummer) des Servers
    if (bind(fd, (struct sockaddr*)&amp;serveradress, sizeof(serveradress)) == SOCKET_ERROR)
	{
        fprintf(stdout,&quot;bind-Fehler: %ld\n&quot;, WSAGetLastError());
		WSACleanup();
		exit(EXIT_FAILURE);
	}

	// Lege Länge der Backlog-Warteschlange fest
	if (listen(fd, QLEN) == SOCKET_ERROR)
	{
        fprintf(stdout, &quot;listen-Fehler: %ld\n&quot;, WSAGetLastError());
		WSACleanup();
		exit(EXIT_FAILURE);
	}

	for( i = 0 ; i &lt; MAXCLIENT; i++ )

	{
		clients[i] = INVALID_SOCKET;
	}

	// ReadSet mit NULL initialisieren:
	FD_ZERO(&amp;ReadSet);
	//Hauptschleife MIT Select()

	while(1) 
	{
		time.tv_sec = 2;            // Abfragedauer für select in Sekunden
		time.tv_usec = 0;           // Abfragedauer für select in Mikrosekunden

		// Socket-Deskriptoren in ReadSet einfügen:
		FD_SET(fd, &amp;ReadSet);

		// alle gültigen Sockets in ReadSet aufnehmen
		for ( i = 0; i &lt; MAXCLIENT; i++ ) 
		{
			if( clients[i] != INVALID_SOCKET )
			{
				FD_SET(clients[i], &amp;ReadSet);
			}
		}
		rc = select( 0, &amp;ReadSet, NULL, NULL, &amp;time );
		if( rc == SOCKET_ERROR )
		{
			fprintf( stdout, &quot;Fehler: select, fehler code: %s\n &quot;, WSAGetLastError() );
			return 1;
		}
		if (FD_ISSET(fd, &amp;ReadSet)) 
		{
			//freien Platz für neuen Client suchen und
			//die Verbindung annehmen
			for( i = 0; i &lt; MAXCLIENT; i++ )
			{
				if( clients[i] == INVALID_SOCKET )
				{
					//Falls Client nicht akzeptiert wird, gib einen Fehler aus und breche ab
					clients[i] = accept( fd, NULL, NULL );
					//clients[i] = accept( fd, (struct sockaddr*)&amp;clientadress, &amp;struct_size );

					//Meldung am Server ausgeben, wenn Client connected
					fprintf( stdout, &quot;Client %s connected\n&quot;, i );

					//Meldung am Client ausgeben, wenn ein Client connected
					sprintf_s( SendBuf, &quot;Client %s hat connected\n&quot; ,i);
					break;
				}
			}
		}
		//prüfen welche ClientSockets in fd_set sind
		for( i = 0; i &lt; MAXCLIENT; i++ ) 
		{
			if( clients[i] == INVALID_SOCKET )
			{
				continue;
				fprintf( stdout, &quot;Fehler: select, fehler code: %s\n &quot;, WSAGetLastError() );
			}
			if( FD_ISSET( clients[i], &amp;ReadSet ) )
			{
				n = recv( clients[i], RecvBuf, RECVBUF_SIZE, 0 );
				/*
					Eingabe im Client von hallo
					Im 1. Durchgang ist dann n=5
					Im 2. Durchgang ist n immer noch 5
					Nach dem 2. Durchlauf wird n -1!!!
					Keine Ahnung warum :(
				*/
				//wurde die Verbindung des Clients geschlossen?
				if( n == 0  || n == SOCKET_ERROR )
				{
					fprintf( stdout, &quot;Fehler: select, fehler code: %s\n &quot;, WSAGetLastError() );
					fprintf( stdout, &quot;Client %d hat die Verbindung geschlossen\n&quot;, i);
					//den socket schließen
					closesocket( clients[i] );
					clients[i] = INVALID_SOCKET;
					//WSACleanup();
				}
				else
				{
					//Empfangene Nachricht ausgeben
					RecvBuf[n] = '\0';
					fprintf( stdout, &quot;Client %d hat geschrieben: %s\n&quot;, i, RecvBuf );
					sprintf_s( SendBuf, &quot;Client %d schrieb: %s\n&quot;, i, RecvBuf );

					for( i = 0; i &lt; MAXCLIENT; i++ )
					{
						//send(clients[i], SendBuf, (int)strlen( SendBuf ), 0 );
						sprintf_s( SendBuf, &quot;Client %d schrieb: %s\n&quot;, i, RecvBuf );
						send(clients[i], SendBuf, (int)strlen( SendBuf ), 0 );
					}
				}
			}
			//RECVBUF leeren?!
			int rbuf = sizeof(RecvBuf);
			for(i = 0; i &lt; rbuf ; i++)
			{
				RecvBuf[i] = 0;
			}
		}
	}//Hauptschleife MIT Select()
	WSACleanup();	
	exit(EXIT_SUCCESS);
} // main
</code></pre>
<p>Programmieren tue ich unter Windows XP und Visual Studio 2008</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/231421/frage-zu-socket-programmierung-und-select</link><generator>RSS for Node</generator><lastBuildDate>Fri, 25 Sep 2026 22:02:15 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/231421.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 10 Jan 2009 17:06:40 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Frage zu Socket-Programmierung und select() on Sat, 10 Jan 2009 17:16:04 GMT]]></title><description><![CDATA[<p>Hallo<br />
Ich habe ein Problem. Es geht um folgendes:<br />
Ich soll im Rahmen meines Studiums eine Client-Server-Anwendung in C/C++ schreiben. Es soll möglich sein mehrere Clients gleichzeitig mittels select() zu bedienen.<br />
Mein Problem ist nun, dass ich einen Client connecte. Von diesem schicke ich einen Text an den Server und der wiederum an den Client als Bestätigung. Meine Server-Schleife wird dabei 2x durchlaufen. Der Puffer für die empfangene Nachricht vom Client enthält auch nach dem leeren des Puffers die geschickte Nachricht. Beim 3. Durchlauf allerdings kommt es zu einem Fehler aber ich weiß nicht warum.<br />
Wenn einer eine Ahnung hat woran es liegt wäre mir sehr geholfen.<br />
Danke schonmal</p>
<pre><code class="language-cpp">// RN_P_Beispielserver.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung.
//
#include &quot;stdafx.h&quot;
#include &lt;stdio.h&gt;
//#include &lt;winsock.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;io.h&gt;
#include &lt;conio.h&gt;

#ifdef _WIN32
#include &lt;winsock.h&gt;
#include &lt;io.h&gt;
#endif

#define PROTOPORT		5000    // Default Portnummer
#define QLEN			6       // Länge der Backlog-Warteschlange
#define AF_INET_LEN		4		// Länge der IPv4-Adresse in Byte
#define RECVBUF_SIZE	100	// Größe des Empfangspuffers
#define SENDBUF_SIZE	100	// Größe des Sendepuffers
#define MAXCLIENT		5

int main(int argc, char* argv[])
{
//---------------------------------------------------------------------------------
// Program:   RN_P_Beispielserver.cpp
//
// Funktion:  Erzeugt einen Socket und führt die folgenden Aktionen zyklisch aus:
//            (1) Wartet auf eingehende Verbindungswünsche von Clients
//            (2) Führe passiven TCP-Verbindungsaufbau durch
//	          (3) Sende eine Nachricht an den Client
//            (4) Schließe die TCP-Verbindung
//            (5) Gehe zurück zu Schritt (1)
//			   
// Aufruf:    RN_P_Beispielserver [&lt;Portnummer&gt;]
//            &lt;Portnummer&gt;: Portnummer unter welcher der Server seinen 
//							Dienst anbietet		
//
// Bemerkung: Die Eingabe der Portnummer ist optional. Falls kein Port spezifiziert
//			  ist, wird der durch PROTOPORT definierte Default-Wert verwendet!    
//
// Dr. W. Schmitt, 06.05.08
//---------------------------------------------------------------------------------

	const char *Datum = &quot;06.05.08&quot;;
    int		Fehlerkode;		// Hilfsvariable zum Speichern eines Fehlerkodes
	protoent *ptrp;			// Speichert den Namen des Transp.Protok.--&gt; winsock.h
	sockaddr_in serveradress;		// Speichert die Serveradresse --&gt; winsock.h
    sockaddr_in clientadress;		// Speichert die Clientadresse --&gt; winsock.h
    SOCKET  fd,		// Socketdeskriptor --&gt; Annahme ank. Verbindungen
			sd_client;      // Socketdeskriptor --&gt; Aktive Clientverbindungen
    unsigned short	port;	// Portnummer des Servers
    int     struct_size;    // Größe einer Datenstruktur
    int		string_len;		// Länge einer Zeichenkette
	int	n;				// Anzahl empfangener Bytes
	char	RecvBuf[RECVBUF_SIZE];	// Puffer für Empfangsdaten
	char    SendBuf[SENDBUF_SIZE];  // Puffer für Sendedaten
	//int     visits = 0;		// Zählt die Anzahl erfolgreicher Clientverbindungen
	WSADATA	wsaData;		// Speichert Winsock-Initialisierungsinfo
    WORD wVersionRequested;	// Speichert die gewünschte Version der Winsock-DLL

	// Variablen für Select()
	int clcnt = 0;		// Aktuelle Anzahl von Verbindungen
	SOCKET	clients[MAXCLIENT];		// Socketdescriptor: Client-Server Datenaustausch
	fd_set ReadSet;			// Enthält Sockets deren Lesestatus überwacht
							// werden soll
	long rc;
	TIMEVAL time;

	int i;

	wVersionRequested = MAKEWORD(2, 2);
	// Initialisierung der Winsock-DLL	
	Fehlerkode = WSAStartup(wVersionRequested, &amp;wsaData);
	if (Fehlerkode != NO_ERROR)
	{
		fprintf_s(stdout,&quot;Initialisierung der Winsock-DLL fehlgeschlagen: %i\n&quot;,
					Fehlerkode);
	} 

	//  Bildschirmausgabe einer Begrüßungsnachricht     	
	fprintf_s(stdout, &quot;Server gestartet\nWarte auf Clients\n&quot;);

	memset(&amp;serveradress, 0, sizeof(serveradress));       // Initialisiere sad mit 0
	serveradress.sin_family = AF_INET;           // Setze &quot;Internetadressierung&quot;
    serveradress.sin_addr.s_addr = INADDR_ANY;   //

	// Auswerten der Kommandozeilenparameter

	// Falls &lt;Portnummer&gt; vorhanden
	if (argc &gt; 1) 
	{	
		// dann konvertiere nach int				
		port = atoi(argv[1]);
	}		
    else 
	{
		// sonst verwende Default-Wert
		port = PROTOPORT;
	}			

    if (port &gt; 0)
	{
        serveradress.sin_port = htons(port); // Host --&gt; Netzwerk-Byteordnung
	}
    else 
	{                          // Drucke Fehlermeldung; Programmende
         fprintf(stdout,&quot;Ungültige Portnummer %s\n&quot;,argv[1]);
		 WSACleanup();
		 exit(EXIT_FAILURE);
	}

    if ((ptrp = getprotobyname(&quot;tcp&quot;)) == NULL)
	{ // &quot;tcp&quot; --&gt; Protokollcode
        fprintf(stdout, &quot;Abbildung von \&quot;tcp\&quot; auf Protokollnummer nicht möglich!&quot;);
		WSACleanup();
		exit(EXIT_FAILURE);
	}

	// Erzeuge Socket
    fd = socket(PF_INET, SOCK_STREAM, ptrp-&gt;p_proto);
    if (fd == INVALID_SOCKET)
	{
		fprintf_s(stdout, &quot;Fehler bei Generierung von Socket: %ld\n&quot;, WSAGetLastError());
		WSACleanup();
		exit(EXIT_FAILURE);
	}

	// Initialisiere Socket mit (Rechneradress, Portnummer) des Servers
    if (bind(fd, (struct sockaddr*)&amp;serveradress, sizeof(serveradress)) == SOCKET_ERROR)
	{
        fprintf(stdout,&quot;bind-Fehler: %ld\n&quot;, WSAGetLastError());
		WSACleanup();
		exit(EXIT_FAILURE);
	}

	// Lege Länge der Backlog-Warteschlange fest
	if (listen(fd, QLEN) == SOCKET_ERROR)
	{
        fprintf(stdout, &quot;listen-Fehler: %ld\n&quot;, WSAGetLastError());
		WSACleanup();
		exit(EXIT_FAILURE);
	}

	for( i = 0 ; i &lt; MAXCLIENT; i++ )

	{
		clients[i] = INVALID_SOCKET;
	}

	// ReadSet mit NULL initialisieren:
	FD_ZERO(&amp;ReadSet);
	//Hauptschleife MIT Select()

	while(1) 
	{
		time.tv_sec = 2;            // Abfragedauer für select in Sekunden
		time.tv_usec = 0;           // Abfragedauer für select in Mikrosekunden

		// Socket-Deskriptoren in ReadSet einfügen:
		FD_SET(fd, &amp;ReadSet);

		// alle gültigen Sockets in ReadSet aufnehmen
		for ( i = 0; i &lt; MAXCLIENT; i++ ) 
		{
			if( clients[i] != INVALID_SOCKET )
			{
				FD_SET(clients[i], &amp;ReadSet);
			}
		}
		rc = select( 0, &amp;ReadSet, NULL, NULL, &amp;time );
		if( rc == SOCKET_ERROR )
		{
			fprintf( stdout, &quot;Fehler: select, fehler code: %s\n &quot;, WSAGetLastError() );
			return 1;
		}
		if (FD_ISSET(fd, &amp;ReadSet)) 
		{
			//freien Platz für neuen Client suchen und
			//die Verbindung annehmen
			for( i = 0; i &lt; MAXCLIENT; i++ )
			{
				if( clients[i] == INVALID_SOCKET )
				{
					//Falls Client nicht akzeptiert wird, gib einen Fehler aus und breche ab
					clients[i] = accept( fd, NULL, NULL );
					//clients[i] = accept( fd, (struct sockaddr*)&amp;clientadress, &amp;struct_size );

					//Meldung am Server ausgeben, wenn Client connected
					fprintf( stdout, &quot;Client %s connected\n&quot;, i );

					//Meldung am Client ausgeben, wenn ein Client connected
					sprintf_s( SendBuf, &quot;Client %s hat connected\n&quot; ,i);
					break;
				}
			}
		}
		//prüfen welche ClientSockets in fd_set sind
		for( i = 0; i &lt; MAXCLIENT; i++ ) 
		{
			if( clients[i] == INVALID_SOCKET )
			{
				continue;
				fprintf( stdout, &quot;Fehler: select, fehler code: %s\n &quot;, WSAGetLastError() );
			}
			if( FD_ISSET( clients[i], &amp;ReadSet ) )
			{
				n = recv( clients[i], RecvBuf, RECVBUF_SIZE, 0 );
				/*
					Eingabe im Client von hallo
					Im 1. Durchgang ist dann n=5
					Im 2. Durchgang ist n immer noch 5
					Nach dem 2. Durchlauf wird n -1!!!
					Keine Ahnung warum :(
				*/
				//wurde die Verbindung des Clients geschlossen?
				if( n == 0  || n == SOCKET_ERROR )
				{
					fprintf( stdout, &quot;Fehler: select, fehler code: %s\n &quot;, WSAGetLastError() );
					fprintf( stdout, &quot;Client %d hat die Verbindung geschlossen\n&quot;, i);
					//den socket schließen
					closesocket( clients[i] );
					clients[i] = INVALID_SOCKET;
					//WSACleanup();
				}
				else
				{
					//Empfangene Nachricht ausgeben
					RecvBuf[n] = '\0';
					fprintf( stdout, &quot;Client %d hat geschrieben: %s\n&quot;, i, RecvBuf );
					sprintf_s( SendBuf, &quot;Client %d schrieb: %s\n&quot;, i, RecvBuf );

					for( i = 0; i &lt; MAXCLIENT; i++ )
					{
						//send(clients[i], SendBuf, (int)strlen( SendBuf ), 0 );
						sprintf_s( SendBuf, &quot;Client %d schrieb: %s\n&quot;, i, RecvBuf );
						send(clients[i], SendBuf, (int)strlen( SendBuf ), 0 );
					}
				}
			}
			//RECVBUF leeren?!
			int rbuf = sizeof(RecvBuf);
			for(i = 0; i &lt; rbuf ; i++)
			{
				RecvBuf[i] = 0;
			}
		}
	}//Hauptschleife MIT Select()
	WSACleanup();	
	exit(EXIT_SUCCESS);
} // main
</code></pre>
<p>Programmieren tue ich unter Windows XP und Visual Studio 2008</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1642981</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1642981</guid><dc:creator><![CDATA[PBo]]></dc:creator><pubDate>Sat, 10 Jan 2009 17:16:04 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Socket-Programmierung und select() on Sat, 10 Jan 2009 17:17:37 GMT]]></title><description><![CDATA[<p>Erstmal wäre es nett zu erfahren, welcher Fehler auftritt...</p>
<p>Du musst FD_ZERO in die Haupt-Schleife verschieben, so dass der Befehl am Anfang eines jeden Schleifendurchlauf ausgeführt wird, da sonst nach <code>select ()</code> noch Sockets im fd_set bleiben, welche du dann beim nächsten Schleifendurchlauf ein zweites Mal einsetzt.</p>
<p>Außerdem könntest du statt:</p>
<pre><code class="language-cpp">fd = socket(PF_INET, SOCK_STREAM, ptrp-&gt;p_proto);
</code></pre>
<p>(und dem Zeug darüber) einfach den letzten Parameter durch 0 ersetzen (wird nicht benötigt).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1642985</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1642985</guid><dc:creator><![CDATA[devkid]]></dc:creator><pubDate>Sat, 10 Jan 2009 17:17:37 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Socket-Programmierung und select() on Sat, 10 Jan 2009 17:20:08 GMT]]></title><description><![CDATA[<p>Ich bekomme diese Fehlermeldung:</p>
<pre><code>Unbehandelte Ausnahme bei 0x1029984f (msvcr90d.dll) in RN_Server.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x00002745.
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1642987</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1642987</guid><dc:creator><![CDATA[PBo]]></dc:creator><pubDate>Sat, 10 Jan 2009 17:20:08 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Socket-Programmierung und select() on Sat, 10 Jan 2009 17:29:52 GMT]]></title><description><![CDATA[<p>Dann lass mal den Debugger warm laufen und guck, an welcher Stelle es hackt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1642992</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1642992</guid><dc:creator><![CDATA[devkid]]></dc:creator><pubDate>Sat, 10 Jan 2009 17:29:52 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Socket-Programmierung und select() on Sat, 10 Jan 2009 17:34:04 GMT]]></title><description><![CDATA[<p>Hab ich schon. Guck mal oben im Code, hab da einen Kommentar drin. An der Stelle wo n -1 wird bricht das Programm ab und der Fehler kommt</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1642994</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1642994</guid><dc:creator><![CDATA[PBo]]></dc:creator><pubDate>Sat, 10 Jan 2009 17:34:04 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Socket-Programmierung und select() on Sat, 10 Jan 2009 17:44:38 GMT]]></title><description><![CDATA[<p>Den Grund (ich nehme mal an, dass das der Grund ist) dafür habe ich dir bereits in meinem ersten Post genannt. Oder hast du das schon ausprobiert?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1642999</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1642999</guid><dc:creator><![CDATA[devkid]]></dc:creator><pubDate>Sat, 10 Jan 2009 17:44:38 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Socket-Programmierung und select() on Sat, 10 Jan 2009 17:47:14 GMT]]></title><description><![CDATA[<p>Ja, ich hab das FD_ZERO schon getestet. Der Fehler bleibt leider der gleiche</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1643002</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1643002</guid><dc:creator><![CDATA[PBo]]></dc:creator><pubDate>Sat, 10 Jan 2009 17:47:14 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Socket-Programmierung und select() on Sat, 10 Jan 2009 17:55:58 GMT]]></title><description><![CDATA[<p>Dann bau mal ein <code>printf (&quot;%s %d\n&quot;, strerror (errno), errno);</code> mit vorherigem <code>#include &lt;errno.h&gt;</code> ein und schau nach, was der Fehler bedeutet bedeutet. (Oder wird das unter Windows mit <code>WSAGetLastError ();</code> gemacht?)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1643004</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1643004</guid><dc:creator><![CDATA[devkid]]></dc:creator><pubDate>Sat, 10 Jan 2009 17:55:58 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Socket-Programmierung und select() on Sat, 10 Jan 2009 18:07:35 GMT]]></title><description><![CDATA[<pre><code>printf (&quot;%s %d\n&quot;, strerror (errno), WSAGetLastError());
</code></pre>
<p>Da gibt er folgendes aus:</p>
<pre><code>No Error 10038
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1643009</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1643009</guid><dc:creator><![CDATA[PBo]]></dc:creator><pubDate>Sat, 10 Jan 2009 18:07:35 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Socket-Programmierung und select() on Sat, 10 Jan 2009 18:31:18 GMT]]></title><description><![CDATA[<p><a href="http://msdn.microsoft.com/en-us/library/ms740668(VS.85).aspx" rel="nofollow">http://msdn.microsoft.com/en-us/library/ms740668(VS.85).aspx</a> schrieb:</p>
<blockquote>
<p>WSAENOTSOCK<br />
10038</p>
<p>Socket operation on nonsocket.<br />
An operation was attempted on something that is not a socket. Either the socket handle parameter did not reference a valid socket, or for select, a member of an fd_set was not valid.</p>
</blockquote>
<p>Dann hat der Client irgendwie die Verbindung abgebrochen oder der Socket ist im Server put gegangen. Kann jetzt auf den ersten Blick den Grund auch nicht erkennen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1643024</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1643024</guid><dc:creator><![CDATA[devkid]]></dc:creator><pubDate>Sat, 10 Jan 2009 18:31:18 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Socket-Programmierung und select() on Sat, 10 Jan 2009 18:34:45 GMT]]></title><description><![CDATA[<p>Ja genau. Hilft es vl wenn ich den Code vom Client auch noch poste?</p>
<pre><code class="language-cpp">// RN_P_Beispielclient.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung.
//
#include &quot;stdafx.h&quot;
#include &lt;winsock.h&gt;
#include &lt;iostream&gt;
#include &lt;conio.h&gt;
#include &lt;io.h&gt;

#define PROTOPORT		5000		// Default Portnummer
#define AF_INET_LEN		4			// Länge IPv4-Adresse in Byte

using namespace std;

int main(int argc, char* argv[])
{
//--------------------------------------------------------------------------------------
// Program:   RN_P_Beispielclient.cpp
//
// Funktion:  Baut eine TCP-Verbindung zu einem Server auf, gibt dessen Nachricht
//			  auf dem Bildschirm aus und bestätigt die Verbindung.
//
// Aufruf:    RN_P_Beispielclient [&lt;Rechnername&gt;][&lt;Portnummer&gt;]
//            &lt;Rechnername&gt;: Rechnername des Servers
//            &lt;Portnummer&gt;: Portnummer unter welcher der Server seinen 
//							Dienst anbietet		
//
// Bemerkung: Die Eingabe der Parameter ist optional. Falls kein Rechnername
//            spezifiziert ist, verwendet der Client &quot;localhost&quot; (127.0.0.1);
//			  falls kein Port spezifiziert ist, wird der durch PROTOPORT definierte
//            Default-Wert verwendet!
//
// Dr. W. Schmitt, 02.05.08
//--------------------------------------------------------------------------------------
	const char *Datum = &quot;02.05.08&quot;;
	int				Fehlerkode;			// Hilfsvariable zum Speichern eines Fehlerkodes
	char localhost[] = &quot;localhost&quot;;		// Default Hostname 
    hostent			*ptrh;				// Speichert den Namen des Clientrechners
    protoent		*ptrp;				// Speichert den Namen des Transp.Protok.
    sockaddr_in		serveradress;				// Speichert die Serveradresse
    SOCKET			sock;					// Socket Descriptor
	unsigned short	port;				// Portnummer des Servers
    char			*host;				// Host Name static_cast&lt;void*&gt;
    unsigned int	n;					// Anzahl empfangener Bytes
    char			RecvBuf[100];		// Puffer für Empfangsdaten
    char			SendBuf[100];		// Puffer für Sendedaten
	char *SendeText = &quot;TCP-Verbindungsaufbau erfolgreich! \n&quot;;
	WSADATA			wsaData;			// Speichert Winsock-Initialisierungsinfo
    WORD wVersionRequested;				// Speichert die gewünschte Version der Winsock-
										// DLL
	wVersionRequested = MAKEWORD(2, 2);
// Initialisierung der Winsock-DLL	
	Fehlerkode = WSAStartup(wVersionRequested, &amp;wsaData);
	if (Fehlerkode != NO_ERROR)
	{
		fprintf_s(stdout,&quot;Initialisierung der Winsock-DLL fehlgeschlagen: %i\n&quot;,
					Fehlerkode);
	}

//  Bildschirmausgabe einer Begrüßungsnachricht        
	fprintf_s(stdout, &quot;Hallo Client!\n&quot;);

    memset(&amp;serveradress, 0, sizeof(serveradress));       // Initialisiere sad mit 0
    serveradress.sin_family = AF_INET;           // Setze &quot;Internetadressierung&quot;

// Auswerten der Kommandozeilenparameter      
	if (argc &gt; 1) 
	{						
		// Falls &lt;Rechnername&gt; vorhanden
		// dann in host speichern
		host = argv[1];
	}				
	else 
	{
		// sonst verwende &quot;localhost&quot;
		host = localhost;
	}				

	ptrh = gethostbyname(host);	        // &lt;Rechnername&gt; --&gt; IP-Adresse

	if (ptrh == NULL) 
	{
        fprintf_s(stdout,&quot;ungültige Rechneradresse: %s\n&quot;, host);
		WSACleanup();
		exit(EXIT_FAILURE);
	}

    if (argc &gt; 2) 
	{                     
		// Falls &lt;Portnummer&gt; vorhanden
		// dann konvertiere nach int
		port = atoi(argv[2]);
	}			
    else
	{
		// sonst verwende Default-Wert 
		port = PROTOPORT;
	}				   

    if (port &gt; 0)            
		serveradress.sin_port = htons(port);		// Host --&gt; Netzwerk-Byteordnung
	else 
	{								// Drucke Fehlermeldung; Programmende
		fprintf_s(stdout,&quot;Ungültige Portnummer %s\n&quot;,argv[2]);
		WSACleanup();
		exit(EXIT_FAILURE);
	}

	if (memcpy_s(&amp;serveradress.sin_addr, AF_INET_LEN, ptrh-&gt;h_addr, ptrh-&gt;h_length))
	{
		fprintf_s(stdout,&quot;Fehler beim Kopieren der Rechneradresse&quot;);
		WSACleanup();
		exit(EXIT_FAILURE);
	}

    if ((ptrp = getprotobyname(&quot;tcp&quot;)) == NULL) 
	{ // &quot;tcp&quot; --&gt; Protokollcode
        fprintf_s(stdout, &quot;Abbildung von \&quot;tcp\&quot; auf Protokollnummer nicht möglich!&quot;);
		WSACleanup();
		exit(EXIT_FAILURE);
	}

	// Erzeuge Socket
	sock = socket(PF_INET, SOCK_STREAM, ptrp-&gt;p_proto); 
    if (sock == INVALID_SOCKET) {
		fprintf_s(stdout, &quot;Fehler bei Generierung von Socket: %ld\n&quot;, WSAGetLastError());
		WSACleanup();
		exit(EXIT_FAILURE);
	}

	// Aktiver Verbindungsaufbau zum Server
	if (connect(sock, (struct sockaddr *)&amp;serveradress, sizeof(serveradress)) == SOCKET_ERROR)
	{
		fprintf_s(stdout,&quot;Fehler beim TCP-Verbindungsaufbau: %ld\n&quot;, WSAGetLastError());
		WSACleanup();
		exit(EXIT_FAILURE);
	}

	//solange du verbunden bist
	while(connect)
	{
		fprintf(stdout, &quot;Bitte Nachricht eingeben:\n&quot;);
		//Lese Text von der Konsole ein und schreibe in SendBuf
		cin.getline(SendBuf, 1000);
		send(sock, SendBuf,strlen(SendBuf),0);

		// Empfangene Daten lesen und auf dem Bildschirm schreiben
		// Daten aus TCP-Empfangspuffer lesen und in RecvBuf schreiben    
		n = recv(sock, RecvBuf, static_cast&lt;int&gt;(strlen(RecvBuf)), 0); 
		RecvBuf[n] = '\0';					// String mit '\0' abschließen
		if (fprintf_s(stdout, RecvBuf, n) &lt; 0)
		{
			fprintf_s(stdout, &quot;Schreib-/Lesefehler!\n&quot;);
		}
		//Falls senden fehlgeschlagen ist: Fehlermeldung und beenden mit Tastendruck
		if (send(sock, SendBuf, static_cast&lt;int&gt;(strlen(SendBuf)), 0) &lt;0)
		{
			fprintf_s( stdout, &quot;Fehler beim Senden!\n&quot; );
			fprintf_s( stdout, &quot;Zum beenden bitte Taste druecken&quot; );
			closesocket( sock );
			WSACleanup();
			while( !_kbhit() );
				exit( EXIT_SUCCESS );
		}
		// Socket schließen und von der Winsock-DLL reservierten Ressourcen freigeben 
		closesocket(sock);
		WSACleanup();
	}//Hauptschleife
} // main
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1643026</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1643026</guid><dc:creator><![CDATA[PBo]]></dc:creator><pubDate>Sat, 10 Jan 2009 18:34:45 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Socket-Programmierung und select() on Sat, 10 Jan 2009 18:43:06 GMT]]></title><description><![CDATA[<p>Ähm ja... Deine Schleifen-Konditionsvariable heißt connect, was in diesem Fall keine Variable sondern eine Funktion ist, auf die der Zeiger immer ungleich 0 ist, was bedeutet, dass die Schleife für immer läuft.<br />
Am Ende der Schleife schließt Du den Socket und räumst WSA auf, wobei du beim nächsten Schleifendurchlauf wieder mit Socket-Funktionen arbeitest?!<br />
<code>cin.getline ();</code> gibst du als Buffer-Größen-Parameter 1000 mit, obwohl der Buffer nur 100 Bytes groß ist. Außerdem verwendest du zwei Mal <code>send ();</code> , wobei du nur beim zweiten Mal prüfst, ob ein Fehler aufgetreten ist...</p>
<p>Mein Tipp: Schmeiß den Code weg und fang noch mal ordentlich an. Ein gutes Tutorial findest du <a href="http://c-worker.ch/tuts/wstut_op.php" rel="nofollow">hier</a>.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1643030</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1643030</guid><dc:creator><![CDATA[devkid]]></dc:creator><pubDate>Sat, 10 Jan 2009 18:43:06 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Socket-Programmierung und select() on Sat, 10 Jan 2009 18:47:27 GMT]]></title><description><![CDATA[<p>Ah ok. Die Differenz 100 zu 1000 war nur Testweise, habs vergessen zu ändern.<br />
Ansonsten Danke für den Tipp. Werd das dann morgen mal in Angriff nehmen.<br />
Falls es nicht klappt, meld ich mich hier wieder</p>
<p>Schönen Abend noch</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1643034</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1643034</guid><dc:creator><![CDATA[PBo]]></dc:creator><pubDate>Sat, 10 Jan 2009 18:47:27 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Socket-Programmierung und select() on Sat, 10 Jan 2009 19:54:05 GMT]]></title><description><![CDATA[<p>Vielleicht solltest du den Code selbst paar mal durchgehen bis es klingelt, bevor du hier postest...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1643079</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1643079</guid><dc:creator><![CDATA[Na sowas]]></dc:creator><pubDate>Sat, 10 Jan 2009 19:54:05 GMT</pubDate></item></channel></rss>