<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>blog.sketchit.de &#187; C / C++</title>
	<atom:link href="http://blog.sketchit.de/tag/cc/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.sketchit.de</link>
	<description>Glaubt mir ich hab den Weihnachtsmann mit eigenen Augen gesehen...</description>
	<lastBuildDate>Wed, 30 Jun 2010 06:28:01 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Kleiner Chat in C (Socketprogrammierung mit UDP)</title>
		<link>http://blog.sketchit.de/2009/10/kleiner-chat-in-c-socketprogrammierung-mit-udp/</link>
		<comments>http://blog.sketchit.de/2009/10/kleiner-chat-in-c-socketprogrammierung-mit-udp/#comments</comments>
		<pubDate>Mon, 19 Oct 2009 14:34:48 +0000</pubDate>
		<dc:creator>Hubert Hölzl</dc:creator>
				<category><![CDATA[C / C++]]></category>
		<category><![CDATA[Multimedia Technology]]></category>
		<category><![CDATA[Netzwerk]]></category>
		<category><![CDATA[Socket]]></category>
		<category><![CDATA[Socketprogrammierung]]></category>

		<guid isPermaLink="false">http://blog.sketchit.de/?p=111</guid>
		<description><![CDATA[Hier mal ein kleines Beispiel, wie man per select() und dem UDP Protokoll sehr einfach einen Chat unter C erstellen kann. Das Programm schaut zuerst, ob auf dem Port 5000 schon jemand lauscht, wenn nicht, wird der 5000er zum senden und der 5001 zum empfangen verwendet. Ist schon ein Chat aktiv, werden die Ports einfach [...]]]></description>
			<content:encoded><![CDATA[<p>Hier mal ein kleines Beispiel, wie man per select() und dem UDP Protokoll sehr einfach einen Chat unter C erstellen kann.<br />
Das Programm schaut zuerst, ob auf dem Port 5000 schon jemand lauscht, wenn nicht, wird der 5000er zum senden und der 5001 zum empfangen verwendet. Ist schon ein Chat aktiv, werden die Ports einfach umgedreht.</p>
<p>Der Rest ist normalerweise selbstklärend. Den Chat einfach im Terminal (unter OS X) starten, dann noch ein Terminal Fenster auf machen, auch hier den Chat starten, und schon funktionierts!<br />
Hint:<br />
- kompilieren per "g++ -o test main.c"<br />
- aufruf per "./chat"<br />
- (natürlich ohne die " " )</p>
<pre name="code" class="c">#include
#include
#include
#include
#include
#include
#include
#include
#include
#include 

#include
#include 

#include 

using namespace std;

void reportError(string str) {
	cout &lt;&lt; endl &lt;&lt; str &lt;&lt; errno &lt;&lt; endl;
}

int main(int argc, char* argv[])
{
	// set the variables
	int sock, bytes_recieved, bytes_send;
	int port1 = atoi("5000");
	int port2 = atoi("5001");
	char send_data [1024] , recv_data[1024];       

	struct sockaddr_in myAddr;
	struct sockaddr_in clientAddr;
	socklen_t sin_size;

	fd_set rfds;

	// create the udp socket
	if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
		reportError("Cannot create send socket ....");
		exit(1);
	}

	myAddr.sin_family = AF_INET;
	myAddr.sin_port = htons(port1);
	myAddr.sin_addr.s_addr = inet_addr("127.0.0.1");

	if (bind(sock, (struct sockaddr *)&amp;myAddr, sizeof(struct sockaddr))== -1) {
		myAddr.sin_family = AF_INET;
		myAddr.sin_port = htons(port2);
		myAddr.sin_addr.s_addr = inet_addr("127.0.0.1");

		clientAddr.sin_family = AF_INET;
		clientAddr.sin_port = htons(port1);
		clientAddr.sin_addr.s_addr = inet_addr("127.0.0.1");

		if(bind(sock, (struct sockaddr *)&amp;myAddr, sizeof(struct sockaddr))== -1) {
			reportError("Unable to bind socket.");
			exit(1);
		}
	}
	else
	{
		clientAddr.sin_family = AF_INET;
		clientAddr.sin_port = htons(port2);
		clientAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
	}

	cout &lt;&lt; "Wait for data, or type something!" &lt;&lt; endl;

	// process incoming connections (forever) ....
	while(1){
		sin_size = sizeof(struct sockaddr_in);

		FD_ZERO(&amp;rfds);
		FD_SET(sock, &amp;rfds);
		FD_SET(0, &amp;rfds);

		select(sock + 1, &amp;rfds, NULL, NULL, NULL);

		if(FD_ISSET(sock, &amp;rfds))
		{
			// receive the reply from the client
			bytes_recieved = recvfrom(sock, recv_data, 1024,0, (struct sockaddr*)&amp;myAddr, &amp;sin_size);

			// client wants the leave, so do we
			if (strcmp(recv_data , "q") == 0 || strcmp(recv_data , "Q") == 0) {
				close(sock);
				break;
			}
			else if(bytes_recieved == -1)
			{
				reportError("recvfrom failed.");
				exit(1);
			} else {
				recv_data[bytes_recieved] = '\0';
				cout &lt;&lt; " " &lt;&lt; recv_data &lt;&lt; endl;
			}
		}
		else if(FD_ISSET(0, &amp;rfds))
		{
			gets(send_data);

			if (strcmp(send_data , "q") != 0 &amp;&amp; strcmp(send_data , "Q") != 0) {
				bytes_send = sendto(sock, send_data, 1024, 0, (struct sockaddr*)&amp;clientAddr, sizeof(struct sockaddr));

				if(bytes_send == -1)
				{
					reportError("Error sending data.");
					exit(1);
				}
			}
			else
			{
				close(sock);
				break;
			}
		}
	}

	close(sock);

	return 0;
}</pre>
<p>Hoffe jemanden bringts was!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.sketchit.de/2009/10/kleiner-chat-in-c-socketprogrammierung-mit-udp/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
