Wie kan me uitleggen hoe een socket server in zijn werk gaat, en hoe je informatie als client kan vragen aan die socket server.

Ik ben een leek op dit gebied. Maar ik wil het met flash (actionscript) gaan proberen op te vangen. Dit moet volgens mij met xml. Is een socket server script in staat om xml door te sturen naar actionscript?
Kunt u me dan uitleggen hoe ik een socket server maak in C++?

Ik weet niet hoe veel werk dit is? Ik moet gewoon xml kunnen versturen naar de client en de client terug.

Ik weet niet wat ik nodig heb voor c++. Ik weet niet waar ik moet beginnen. Hopelijk kunt u me helpen als het natuurlijk niet te veel tijd/moeite kost.

#include <cstdlib>
#include <iostream>
#include <vector>
//#include <map>

// Sockets
#ifdef WIN32
#include <winsock2.h>
#else
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#endif

// MySQL
//#include <mysql/mysql.h>

// Internal
//#include "headers.h"
//#include "database.h"
//#include "commands.h"
//#include "Server.h"
//#include "globals.h"

// Globals
WSADATA wsaData;
int listener;
char yes = '1';
//vector<int> connectfds(0);
//vector<sockaddr_in> connectaddrs;
fd_set master;
fd_set read_fds;
struct sockaddr_in myaddr;
struct sockaddr_in remoteaddr;
int fdmax;
int newfd;
char buffer[1024];
int nbytes;
int addrlen;
//map<string, int> users;
//map<int, string> fds;
//map<int, string> proto;
//map<int, string> messagesin;
char messageout[1024];
//Database* dbconn = new Database;

// Functions
void startWinsock()
{
	int err = WSAStartup(MAKEWORD(2, 2), &wsaData);
	if (err != 0)
	{
		#if DEBUG
		cout << "Fatal error: Couldn't startup WinSock" << endl;
		#endif
		exit(1);
	}
}

void closeWinsock()
{
	WSACleanup();
}

int sendAll(int s, char *buf, int *len)
{
	int total = 0;
	int bytesleft = *len;
	int n;

	while(total < *len)
	{
		n = send(s, buf+total, bytesleft, 0);
		if (n == -1)
		{
			break;
		}
		total += n;
		bytesleft -= n;
	}

	*len = total;

	return (n == -1) ? -1 : 0;
} 

void createSocket()
{
	FD_ZERO(&master);
	FD_ZERO(&read_fds);

	if ((listener = socket(PF_INET, SOCK_STREAM, 0)) == -1)
	{
		#if DEBUG
		cout << "Fatal error: Couldn't create a socket" << endl;
		#endif
		exit(1);
	}

	if (setsockopt(listener, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) == -1)
	{
		#if DEBUG
		cout << "Fatal error: Couldn't set socket reusability" << endl;
		#endif
		exit(1);
	}

	myaddr.sin_family = AF_INET;
	myaddr.sin_addr.s_addr = INADDR_ANY;
	myaddr.sin_port = htons(PORT);
	memset(&(myaddr.sin_zero), '\0', 8);

	if (bind(listener, (struct sockaddr *)&myaddr, sizeof(struct sockaddr)) == -1)
	{
		#if DEBUG
		cout << "Fatal error: Couldn't bind the socket" << endl;
		#endif
		exit(1);
	}

	if (listen(listener, PENDING) == -1)
	{
		#if DEBUG
		cout << "Fatal error: Couldn't start listening to the socket" << endl;
		#endif
		exit(1);
	}

	FD_SET(listener, &master);

	fdmax = listener;
}

void killSocket()
{
	closesocket(listener);
}

void executeCommand(int exec_fd, string command, string params)
{
	if (command == "IETS")
	{
		// bla die bla
	}
}

void runMainLoop()
{
	while (1)
	{
		read_fds = master;
		if (select(fdmax + 1, &read_fds, NULL, NULL, NULL) == -1)
		{
			#if DEBUG
			cout << "Fatal error: Couldn't select a connection" << endl;
			#endif
			exit(1);
		}

		for (int i = 0; i <= fdmax; i++)
		{
			if (FD_ISSET(i, &read_fds))
			{
				if (i == listener)
				{
					addrlen = sizeof(remoteaddr);
					if ((newfd = accept(listener, (struct sockaddr *)&remoteaddr, &addrlen)) == -1)
					{
						#if DEBUG
						cout << "Error: Couldn't accept connection" << endl;
						#endif
					}
					else
					{
						FD_SET(newfd, &master);
						if (newfd > fdmax)
						{
							fdmax = newfd;
						}
						#if DEBUG
						cout << "New connection: " << newfd << " (IP: " << inet_ntoa(remoteaddr.sin_addr) << ")" << endl;
						#endif

						sprintf(messageout, "WELCOME\r\n");
						int size = strlen(messageout);
						sendAll(newfd, messageout, &size);
						messagesin[i] = "";
						fds[i] = "";
						proto[i] = "";
					}
				}
				else
				{
					if ((nbytes = recv(i, buffer, sizeof(buffer), 0)) <= 0)
					{
						if (nbytes == 0)
						{
							#if DEBUG
							cout << "Connection closed: " << i << endl;
							#endif
						}
						else
						{
							#if DEBUG
							cout << "Error: Couldn't receive data" << endl;
							#endif
						}
						closesocket(i);
						FD_CLR(i, &master);
						messagesin.erase(i);
						users.erase(fds[i]);
						fds.erase(i);
						proto.erase(i);
					}
					else
					{
						buffer[nbytes] = '\0';
						messagesin[i] += buffer;

						int crlf = messagesin[i].find("\r\n", 0);

						if (crlf != string::npos)
						{
							string messagein = "";
							messagein = messagesin[i].substr(0, crlf);
							messagesin[i] = messagesin[i].substr(crlf + 2);

							#if DEBUG
							cout << "Received from " << i << ": " << messagein << endl;
							#endif

							string command = "";
							string params = "";
							int space = messagein.find(" ", 0);
							if (space != string::npos)
							{
								command = messagein.substr(0, space);
								params = messagein.substr(space + 1);
							}
							else
							{
								command = messagein;
							}

							executeCommand(i, command, params);
						}

						//for (int j = 0; j <= fdmax; j++)
						//{
						//	if (FD_ISSET(j, &master))
						//	{
						//		if (j != listener && j != i)
						//		{
						//			int sendbytes = nbytes;
						//			if (sendAll(j, buffer, &sendbytes) == -1)
						//			{
						//				cout << "Error: Couldn't send data" << endl;
						//			}
						//		}
						//	}
						//}
					}
				}
			}
		}
	}
}

int main(int argc, char *argv[])
{
	startWinsock();
	createSocket();
	runMainLoop();
	killSocket();
	closeWinsock();

    return EXIT_SUCCESS;
}


Dit kan van meerdere hosts connecties ontvangen en behandelen. Hij wacht op data en bij elke volledige enter (\r\n) behandelt hij de data. De huidige behandel style is command params: tot de eerste satie is het commando de rest daarna params.
Oke.. is het veel moeite om uit te leggen hoe het werkt? en wat ik precies moet doen?

Stel, ik stuur een string. In actionscript gaat dat zo (help files):

var myXMLSocket:XMLSocket = new XMLSocket();
var my_xml:XML = new XML();
var myLogin:XMLNode = my_xml.createElement("login");
myLogin.attributes.username = usernameTextField;
myLogin.attributes.password = passwordTextField;
my_xml.appendChild(myLogin);
myXMLSocket.send(my_xml);


Wat doet dat socket server script dan?
@Steven en eigenlijk iedereen: Onze socket server moet gegevens ontvangen van een persoon, en die weer aan alle personen doorsturen. Dus 1 iemand pusht een gegeven naar de socket server, en alle spelers moeten dat gegeven ontvangen. Maar dat moeten dus álle spelers kunnen, ze moeten allemaal gegevens kunnen 'verspreiden' aan 'elkaar'.
Ik hoop dat jullie het snappen?

MvG,
Niek
@legolas: zo te zien is uw code voor windows bestemd? zal dan helaas niet werken, ik draai hier FreeBSD unix...

[edit]ik bedoel natuurlijk op de server waar het allemaal op komt[/edit]
@niek: de code bevat wat extra dingen om het ook op windows te laten werken, het is origineel linux, ik denk dat ik misschien wat conditional comments vergeten ben omdat ik het nog niet op linux heb uit kunnen testen, maar t zou moeten werken als je startwinsock en stopwinsock sloopt.

Het zou mij erg helpen als je met ethereal (http://www.ethereal.com/) even kijkt wat flash allemaal verstuurt (dump het evt. gewoon naar je webserver ofzo, zolang je maar iets over het netwerk pompt) en dat hier dumpt.
Oke, ik heb het programma gedownload. Wat moet ik nu doen?
evn laten draaien terwijl je je actionscript uitvoert en dan kijken wat er verstuurt is
Waar moet ik het naar toe sturen. Ik snap niet hoe dit programma werkt. Dus dat word echt goochelen.
dat programma kijkt gewoon wat je computer over het netwerk stuurt.

Reageren