<?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[Problem mit Sockets]]></title><description><![CDATA[<p>hi,</p>
<p>bin gerade dabei, mich mit Sockets zu beschäftigen. Habe ein Beispiel, bei dem ich über das UDP-Protokoll Daten bzw. einfache Strings austausche. Ich starte also den Sever, dann über Kommandozeilen-Argumente den Client und will dann Strings an den Server schicken, der diesen ausgibt und eine Meldung an den Client zurückgibt, dass er den Text erhalten hat.</p>
<p>Problem ist nur, dass immer die Exception: Konnte Daten nicht senden ausgelöst wird und ich aber nicht versteh', wo der Fehler liegen soll.</p>
<p>Hier der Code (in Visual Studio 2005 Pro erstellt):</p>
<p><strong>socket.h</strong></p>
<pre><code class="language-cpp">#ifndef _SOCKET_H
#define _SOCKET_H
#include &lt;iostream&gt;
#include &lt;Windows.h&gt;
#include &lt;WinSock.h&gt;
#include &lt;string&gt;
#include &lt;io.h&gt;
using namespace std;

// max. Anzahl Verbindungen
const int MAXCONNECTIONS = 5;
// max. Anzahl Daten, die auf einmal empfangen werden
const int MAXRECV = 1024;

class Socket
{
private:
	// Socket-Deskriptor
	int m_sock;
	// Struktur sockaddr_in
	sockaddr_in m_addr;

public:
	Socket();
	~Socket();

	// Socket erstellen - TCP
	bool create();
	// Socket erstellen - UDP
	bool UDP_create();
	bool bind(const int port);
	bool listen() const;
	bool accept(Socket&amp;) const;
	bool connect(const string host, const int port);

	// Datenübertragung TCP
	bool send(const string) const;
	int recv(string&amp;) const;
	// Datenübertragung UDP
	bool UDP_send(const string, const string, const int port) const;
	int UDP_recv(string&amp;) const;

	// Socket schließen
	bool close() const;
	// WSACleanup()
	void cleanup() const;
	bool is_valid() const;
};

class SockExcept
{
private:
	string except;

public:
	SockExcept(string s) : except(s) {};
	~SockExcept() {};
	string get_SockExcept() {return except;};
};
#endif
</code></pre>
<p><strong>socket.cpp</strong></p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;Windows.h&gt;
#include &lt;WinSock.h&gt;
#include &lt;string&gt;
#include &lt;cstdlib&gt;
#include &quot;socket.h&quot;
using namespace std;

Socket::Socket() : m_sock(0)
{
	// WinSock.dll initialisieren
	WORD wVersionRequested;
	WSADATA wsaData;
	wVersionRequested = MAKEWORD(1, 1);
	if (WSAStartup(wVersionRequested, &amp;wsaData) != 0)
	{
		throw SockExcept(&quot;Fehler beim Initialisieren von Winsock\n&quot;);
	}
}

Socket::~Socket()
{
	if (is_valid())
		::closesocket(m_sock);
}

bool Socket::is_valid() const
{
	return m_sock != -1;
}

// erzeugt das Socket-TCP
bool Socket::create()
{
	m_sock = (int)::socket(AF_INET, SOCK_STREAM, 0);
	if (m_sock &lt; 0)
	{
		throw SockExcept(&quot;Fehler beim Anlegen eines Socket\n&quot;);
	}
	return true;
}

// erzeugt das Socket-UDP
bool Socket::UDP_create()
{
	m_sock = (int)::socket(AF_INET, SOCK_DGRAM, 0);
	if (m_sock &lt; 0)
	{
		throw SockExcept(&quot;Fehler beim Anlegen eines Socket\n&quot;);
		exit(1);
	}
	return true;
}

// Bindung an bestimmten Port
bool Socket::bind(const int port)
{
	if (!is_valid())
	{
		return false;
	}
	m_addr.sin_family = AF_INET;
	m_addr.sin_addr.s_addr = INADDR_ANY;
	m_addr.sin_port = htons(port);

	int bind_return = ::bind(m_sock, (struct sockaddr*) &amp;m_addr, sizeof(m_addr));
	if (bind_return == -1)
		return false;

	return true;
}

// Socket mitteilen, dass Verbindungswünsche von Clients entgegengenommen werden
bool Socket::listen() const
{
	if (!is_valid())
		return false;

	int listen_return = ::listen(m_sock, MAXCONNECTIONS);
	if (listen_return == -1)
		return false;

	return true;
}

// Verbindungswünsche von Clients bearbeiten
// Aufruf von accept() blockiert so lange, bis ein Client Verbindung aufnimmt
bool Socket::accept(Socket&amp; new_Socket) const
{
	int addr_length = sizeof(m_addr);
	new_Socket.m_sock = (int)::accept(m_sock, (sockaddr*) &amp;m_addr, (int*) &amp;addr_length);

	if (new_Socket.m_sock &lt;= 0)
		return false;
	else
		return true;
}

// baut Verbindung zum Server auf
bool Socket::connect(const string host, const int port)
{
	if (!is_valid())
	{
		return false;
	}

	struct hostent *host_info;
	unsigned long addr;
	memset(&amp;m_addr, 0, sizeof(m_addr));
	if (addr = inet_addr(host.c_str()) != INADDR_NONE)
	{
		// argv[1] ist eine numerische IP_Adresse
		memcpy((char*) &amp;m_addr.sin_addr, &amp;addr, sizeof(addr));
	}
	else
	{
		// Servernamen (z.B. localhost) in IP-Adresse umwandeln
		host_info = gethostbyname(host.c_str());
		if (NULL == host_info)
		{
			throw SockExcept(&quot;Unbekannter Server\n&quot;);
			exit(1);
		}
		memcpy((char*) &amp;m_addr.sin_addr, host_info-&gt;h_addr, host_info-&gt;h_length);
	}

	m_addr.sin_family = AF_INET;
	m_addr.sin_port = htons(port);
	int status = ::connect(m_sock, (sockaddr*) &amp;m_addr, sizeof(m_addr));
	if (status == 0)
		return true;
	else
		return false;
}

// Daten versenden via TCP
bool Socket::send(const std::string s) const
{
	int status = ::send(m_sock, s.c_str(), (int)s.size(), 0);
	if (status == -1)
		return false;
	else
		return true;
}

// Daten empfangen via TCP
int Socket::recv(std::string &amp;s) const
{
	char buf[MAXRECV+1];
	s = &quot;&quot;;
	memset(buf, 0, MAXRECV+1);

	int status = ::recv(m_sock, buf, MAXRECV, 0);
	if (status &gt; 0 || status != SOCKET_ERROR)
	{
		s = buf;
		return status;
	}
	else
	{
		throw SockExcept(&quot;Fehler in Socket::recv\n&quot;);
		exit(1);
		return 0;
	}
}

// Daten versenden via UDP
bool Socket::UDP_send(const string addr, const string s, const int port) const
{
	struct sockaddr_in addr_sento;
	struct hostent *h;
	int rc;

	h = gethostbyname(addr.c_str());
	if (h == NULL)
	{
		throw SockExcept(&quot;Unbekannter Host\n&quot;);
		exit(1);
	}
	addr_sento.sin_family = h-&gt;h_addrtype;
	memcpy((char*) &amp;addr_sento.sin_addr.s_addr, h-&gt;h_addr_list[0], h-&gt;h_length);
	addr_sento.sin_port = htons(port);
	rc = sendto(m_sock, s.c_str(), (int)s.size(), 0, (struct sockaddr *) &amp;addr_sento, sizeof(addr_sento));

	if (rc == SOCKET_ERROR)
	{
		throw SockExcept(&quot;Konnte Daten nicht senden - sendto()\n&quot;);
		exit(1);
	}
	return true;
}

// Daten empfangen via UDP
int Socket::UDP_recv(std::string &amp;s) const
{
	struct sockaddr_in addr_recvfrom;
	int len, n;
	char buf[MAXRECV+1];
	s = &quot;&quot;;
	memset(buf, 0, MAXRECV+1);
	len = sizeof(addr_recvfrom);
	n = recvfrom(m_sock, buf, MAXRECV, 0, (struct sockaddr*) &amp;addr_recvfrom, &amp;len);

	if (n == SOCKET_ERROR)
	{
		throw SockExcept(&quot;Fehler bei recvfrom()\n&quot;);
		exit(1);
		return 0;
	}
	else
	{
		s = buf;
		return n;
	}
}

// Winsock.dll freigeben
void Socket::cleanup() const
{
	WSACleanup();
}

// Socket schließen und Winsock.dll freigeben
bool Socket::close() const
{
	closesocket(m_sock);
	cleanup();
	return true;
}
</code></pre>
<p><strong>Main.cpp</strong> (vom Server</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;string&gt;
#include &quot;socket.h&quot;
using namespace std;

int main()
{
	try
	{
		Socket server;
		server.UDP_create();
		server.bind(14000);
		cout &lt;&lt; &quot;Server wartet auf Daten...&quot; &lt;&lt; endl;
		try
		{
			while (true)
			{
				string s;
				server.UDP_recv(s);
				cout &lt;&lt; &quot;Daten erhalten: &quot; &lt;&lt; s &lt;&lt; endl;
			}
		}
		catch (SockExcept &amp;) {}
	}
	catch (SockExcept &amp;e)
	{
		cout &lt;&lt; &quot;Exception: &quot; &lt;&lt; e.get_SockExcept() &lt;&lt; endl;
	}
	cin.get();
	return 0;
}
</code></pre>
<p><strong>client.cpp</strong></p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;string&gt;
#include &quot;socket.h&quot;
using namespace std;

int main(int argc, char *argv[])
{
	if (argc &lt; 3)
	{
		cout &lt;&lt; &quot;Usage: &quot; &lt;&lt; argv[0] &lt;&lt; &quot; &lt;server&gt; &lt;string&gt;&quot; &lt;&lt; endl;
		//exit(1);
	}
	try
	{
		Socket client;
		client.UDP_create();
		client.bind(14000);
		string argv_1 = argv[1];
		string argv_2 = argv[2];
		client.UDP_send(argv_1, argv_2, 14000);
	}
	catch (SockExcept &amp;e)
	{
		cout &lt;&lt; &quot;Exception: &quot; &lt;&lt; e.get_SockExcept() &lt;&lt; endl;
	}
	return 0;
}
</code></pre>
<p>Vllt hab ihr noch weitere Hinweise zu dem Code, was vllt schlecht gelöst ist...<br />
Hoffe, ihr könnt mir helfen und habt verstanden, was ich meine <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>thx im voraus</p>
<p>mfg R3dNeXX</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/227120/problem-mit-sockets</link><generator>RSS for Node</generator><lastBuildDate>Wed, 30 Sep 2026 06:22:10 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/227120.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 11 Nov 2008 09:55:35 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem mit Sockets on Tue, 11 Nov 2008 09:55:35 GMT]]></title><description><![CDATA[<p>hi,</p>
<p>bin gerade dabei, mich mit Sockets zu beschäftigen. Habe ein Beispiel, bei dem ich über das UDP-Protokoll Daten bzw. einfache Strings austausche. Ich starte also den Sever, dann über Kommandozeilen-Argumente den Client und will dann Strings an den Server schicken, der diesen ausgibt und eine Meldung an den Client zurückgibt, dass er den Text erhalten hat.</p>
<p>Problem ist nur, dass immer die Exception: Konnte Daten nicht senden ausgelöst wird und ich aber nicht versteh', wo der Fehler liegen soll.</p>
<p>Hier der Code (in Visual Studio 2005 Pro erstellt):</p>
<p><strong>socket.h</strong></p>
<pre><code class="language-cpp">#ifndef _SOCKET_H
#define _SOCKET_H
#include &lt;iostream&gt;
#include &lt;Windows.h&gt;
#include &lt;WinSock.h&gt;
#include &lt;string&gt;
#include &lt;io.h&gt;
using namespace std;

// max. Anzahl Verbindungen
const int MAXCONNECTIONS = 5;
// max. Anzahl Daten, die auf einmal empfangen werden
const int MAXRECV = 1024;

class Socket
{
private:
	// Socket-Deskriptor
	int m_sock;
	// Struktur sockaddr_in
	sockaddr_in m_addr;

public:
	Socket();
	~Socket();

	// Socket erstellen - TCP
	bool create();
	// Socket erstellen - UDP
	bool UDP_create();
	bool bind(const int port);
	bool listen() const;
	bool accept(Socket&amp;) const;
	bool connect(const string host, const int port);

	// Datenübertragung TCP
	bool send(const string) const;
	int recv(string&amp;) const;
	// Datenübertragung UDP
	bool UDP_send(const string, const string, const int port) const;
	int UDP_recv(string&amp;) const;

	// Socket schließen
	bool close() const;
	// WSACleanup()
	void cleanup() const;
	bool is_valid() const;
};

class SockExcept
{
private:
	string except;

public:
	SockExcept(string s) : except(s) {};
	~SockExcept() {};
	string get_SockExcept() {return except;};
};
#endif
</code></pre>
<p><strong>socket.cpp</strong></p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;Windows.h&gt;
#include &lt;WinSock.h&gt;
#include &lt;string&gt;
#include &lt;cstdlib&gt;
#include &quot;socket.h&quot;
using namespace std;

Socket::Socket() : m_sock(0)
{
	// WinSock.dll initialisieren
	WORD wVersionRequested;
	WSADATA wsaData;
	wVersionRequested = MAKEWORD(1, 1);
	if (WSAStartup(wVersionRequested, &amp;wsaData) != 0)
	{
		throw SockExcept(&quot;Fehler beim Initialisieren von Winsock\n&quot;);
	}
}

Socket::~Socket()
{
	if (is_valid())
		::closesocket(m_sock);
}

bool Socket::is_valid() const
{
	return m_sock != -1;
}

// erzeugt das Socket-TCP
bool Socket::create()
{
	m_sock = (int)::socket(AF_INET, SOCK_STREAM, 0);
	if (m_sock &lt; 0)
	{
		throw SockExcept(&quot;Fehler beim Anlegen eines Socket\n&quot;);
	}
	return true;
}

// erzeugt das Socket-UDP
bool Socket::UDP_create()
{
	m_sock = (int)::socket(AF_INET, SOCK_DGRAM, 0);
	if (m_sock &lt; 0)
	{
		throw SockExcept(&quot;Fehler beim Anlegen eines Socket\n&quot;);
		exit(1);
	}
	return true;
}

// Bindung an bestimmten Port
bool Socket::bind(const int port)
{
	if (!is_valid())
	{
		return false;
	}
	m_addr.sin_family = AF_INET;
	m_addr.sin_addr.s_addr = INADDR_ANY;
	m_addr.sin_port = htons(port);

	int bind_return = ::bind(m_sock, (struct sockaddr*) &amp;m_addr, sizeof(m_addr));
	if (bind_return == -1)
		return false;

	return true;
}

// Socket mitteilen, dass Verbindungswünsche von Clients entgegengenommen werden
bool Socket::listen() const
{
	if (!is_valid())
		return false;

	int listen_return = ::listen(m_sock, MAXCONNECTIONS);
	if (listen_return == -1)
		return false;

	return true;
}

// Verbindungswünsche von Clients bearbeiten
// Aufruf von accept() blockiert so lange, bis ein Client Verbindung aufnimmt
bool Socket::accept(Socket&amp; new_Socket) const
{
	int addr_length = sizeof(m_addr);
	new_Socket.m_sock = (int)::accept(m_sock, (sockaddr*) &amp;m_addr, (int*) &amp;addr_length);

	if (new_Socket.m_sock &lt;= 0)
		return false;
	else
		return true;
}

// baut Verbindung zum Server auf
bool Socket::connect(const string host, const int port)
{
	if (!is_valid())
	{
		return false;
	}

	struct hostent *host_info;
	unsigned long addr;
	memset(&amp;m_addr, 0, sizeof(m_addr));
	if (addr = inet_addr(host.c_str()) != INADDR_NONE)
	{
		// argv[1] ist eine numerische IP_Adresse
		memcpy((char*) &amp;m_addr.sin_addr, &amp;addr, sizeof(addr));
	}
	else
	{
		// Servernamen (z.B. localhost) in IP-Adresse umwandeln
		host_info = gethostbyname(host.c_str());
		if (NULL == host_info)
		{
			throw SockExcept(&quot;Unbekannter Server\n&quot;);
			exit(1);
		}
		memcpy((char*) &amp;m_addr.sin_addr, host_info-&gt;h_addr, host_info-&gt;h_length);
	}

	m_addr.sin_family = AF_INET;
	m_addr.sin_port = htons(port);
	int status = ::connect(m_sock, (sockaddr*) &amp;m_addr, sizeof(m_addr));
	if (status == 0)
		return true;
	else
		return false;
}

// Daten versenden via TCP
bool Socket::send(const std::string s) const
{
	int status = ::send(m_sock, s.c_str(), (int)s.size(), 0);
	if (status == -1)
		return false;
	else
		return true;
}

// Daten empfangen via TCP
int Socket::recv(std::string &amp;s) const
{
	char buf[MAXRECV+1];
	s = &quot;&quot;;
	memset(buf, 0, MAXRECV+1);

	int status = ::recv(m_sock, buf, MAXRECV, 0);
	if (status &gt; 0 || status != SOCKET_ERROR)
	{
		s = buf;
		return status;
	}
	else
	{
		throw SockExcept(&quot;Fehler in Socket::recv\n&quot;);
		exit(1);
		return 0;
	}
}

// Daten versenden via UDP
bool Socket::UDP_send(const string addr, const string s, const int port) const
{
	struct sockaddr_in addr_sento;
	struct hostent *h;
	int rc;

	h = gethostbyname(addr.c_str());
	if (h == NULL)
	{
		throw SockExcept(&quot;Unbekannter Host\n&quot;);
		exit(1);
	}
	addr_sento.sin_family = h-&gt;h_addrtype;
	memcpy((char*) &amp;addr_sento.sin_addr.s_addr, h-&gt;h_addr_list[0], h-&gt;h_length);
	addr_sento.sin_port = htons(port);
	rc = sendto(m_sock, s.c_str(), (int)s.size(), 0, (struct sockaddr *) &amp;addr_sento, sizeof(addr_sento));

	if (rc == SOCKET_ERROR)
	{
		throw SockExcept(&quot;Konnte Daten nicht senden - sendto()\n&quot;);
		exit(1);
	}
	return true;
}

// Daten empfangen via UDP
int Socket::UDP_recv(std::string &amp;s) const
{
	struct sockaddr_in addr_recvfrom;
	int len, n;
	char buf[MAXRECV+1];
	s = &quot;&quot;;
	memset(buf, 0, MAXRECV+1);
	len = sizeof(addr_recvfrom);
	n = recvfrom(m_sock, buf, MAXRECV, 0, (struct sockaddr*) &amp;addr_recvfrom, &amp;len);

	if (n == SOCKET_ERROR)
	{
		throw SockExcept(&quot;Fehler bei recvfrom()\n&quot;);
		exit(1);
		return 0;
	}
	else
	{
		s = buf;
		return n;
	}
}

// Winsock.dll freigeben
void Socket::cleanup() const
{
	WSACleanup();
}

// Socket schließen und Winsock.dll freigeben
bool Socket::close() const
{
	closesocket(m_sock);
	cleanup();
	return true;
}
</code></pre>
<p><strong>Main.cpp</strong> (vom Server</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;string&gt;
#include &quot;socket.h&quot;
using namespace std;

int main()
{
	try
	{
		Socket server;
		server.UDP_create();
		server.bind(14000);
		cout &lt;&lt; &quot;Server wartet auf Daten...&quot; &lt;&lt; endl;
		try
		{
			while (true)
			{
				string s;
				server.UDP_recv(s);
				cout &lt;&lt; &quot;Daten erhalten: &quot; &lt;&lt; s &lt;&lt; endl;
			}
		}
		catch (SockExcept &amp;) {}
	}
	catch (SockExcept &amp;e)
	{
		cout &lt;&lt; &quot;Exception: &quot; &lt;&lt; e.get_SockExcept() &lt;&lt; endl;
	}
	cin.get();
	return 0;
}
</code></pre>
<p><strong>client.cpp</strong></p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;string&gt;
#include &quot;socket.h&quot;
using namespace std;

int main(int argc, char *argv[])
{
	if (argc &lt; 3)
	{
		cout &lt;&lt; &quot;Usage: &quot; &lt;&lt; argv[0] &lt;&lt; &quot; &lt;server&gt; &lt;string&gt;&quot; &lt;&lt; endl;
		//exit(1);
	}
	try
	{
		Socket client;
		client.UDP_create();
		client.bind(14000);
		string argv_1 = argv[1];
		string argv_2 = argv[2];
		client.UDP_send(argv_1, argv_2, 14000);
	}
	catch (SockExcept &amp;e)
	{
		cout &lt;&lt; &quot;Exception: &quot; &lt;&lt; e.get_SockExcept() &lt;&lt; endl;
	}
	return 0;
}
</code></pre>
<p>Vllt hab ihr noch weitere Hinweise zu dem Code, was vllt schlecht gelöst ist...<br />
Hoffe, ihr könnt mir helfen und habt verstanden, was ich meine <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>thx im voraus</p>
<p>mfg R3dNeXX</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1613073</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1613073</guid><dc:creator><![CDATA[R3dNeXX]]></dc:creator><pubDate>Tue, 11 Nov 2008 09:55:35 GMT</pubDate></item></channel></rss>