Socket voor communicatie naar Flash

Status
Niet open voor verdere reacties.

Cyroq

Gebruiker
Lid geworden
7 apr 2009
Berichten
180
Hallo,

Ik heb eigenlijk helemaal geen ervaring in C++, maar gelukkig wel in andere talen. Al een tijdje ben ik op zoek naar een manier om C++ met Flash te laten communiceren, en als ik het goed heb moet ik gebruik maken van een (XML) Socket. Ik heb inmiddels gevonden hoe ik een Socket open in Flash, echter kan ik geen concrete code vinden voor C++. Er werd namelijk aangeraden gebruik te maken van bestaande sockets. Met wat ik heb gevonden kwam ik niet ver aangezien ik niet goed weet hoe ik deze code aanpas. Ik hoef alleen maar een paar variabelen naar Flash door te sturen.
Mijn vraag is dus, hoe ga ik verder? Misschien heeft iemand een goede link hiervoor, of een tip hoe ik zo'n socket open.

Alvast bedankt!
 
Thanks. Inmiddels heb ik (met behulp van anderen) een stukje C++ code geschreven. Het volgende stuk zou een socket moeten openen, maar ik krijg Flash niet aan het communiceren hiermee. Dit is de code:
Code:
   WSADATA wsaData;
	SOCKET sock;
	struct sockaddr_in cppprog, flashprog;

	/* Initialiseer de WinSock bibliotheek */
	if ( WSAStartup(MAKEWORD(1,1), &wsaData) != 0 )
		handle_error();

	/* Stel informatie in over de bron (dit C++ programma) */
	cppprog.sin_family      = AF_INET;
	cppprog.sin_addr.s_addr = inet_addr( "127.0.0.1" );
	cppprog.sin_port        = htons(2001);

	/* Stel infromatie in over het doel (het Flash programma) */
	flashprog.sin_family      = AF_INET;
	flashprog.sin_addr.s_addr = inet_addr( "127.0.0.1" );
	flashprog.sin_port        = htons(2000);

	/* Maak een socket */
	if ( (sock=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == INVALID_SOCKET )
		handle_error();

	/* Hang de socket aan de goede port e.d. */
	bind(sock, (sockaddr *)&cppprog, sizeof(cppprog));

	while(true) {
		int aanslagen = count;
		sendto(sock, (char *) &aanslagen, sizeof(aanslagen), 0, (sockaddr *) &flashprog, sizeof(flashprog) );
	}
Hier is 'aanslagen' een integer welke doorgestuurd moet worden naar Flash. Hoe kan ik nu in Flash deze variabele oproepen? Deze code heb ik nu (AS2) maar werkt dus niet.
Code:
function myOnConnect(success) {
	if (success) {
		trace("Connection succeeded!");
	} else {
		trace("Connection failed!");
	}
}
socket = new XMLSocket();
socket.onConnect = myOnConnect;
if (!socket.connect("127.0.0.1", 2000)) {
	trace("Connection failed!");
}
myOnConnect();
trace(aanslagen);
Overigens kan dit topic misschien beter naar de Flash-sectie verplaatst worden, tenzij mijn C++ code nog niet in orde is.
 
Volgens de info hier http://www.adobe.com/support/flash/...pt_dictionary/actionscript_dictionary860.html
maakt een XMLSocket gebruik van TCP stream sockets en niet van UDP datagram sockets.
Het XMLSocket object (van Flash) is de client. Het c++ programma wordt dan de server.

Om een stream socket te maken wordt
Code:
if ( (sock=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == INVALID_SOCKET )
		handle_error();
dit:
if ( (sock=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET )
		handle_error();

De variabele cppprog kan je beter op 0 initialiseren zodat
het niet gebruikte element cppprog.sin_zero 0 is.
verander
struct sockaddr_in cppprog
=>
struct sockaddr_in cppprog={0}
Het is ook handig om te controleren of bind() wel gelukt is.

In de c++ code zal je ook listen() en accept() moeten aanroepen omdat het
een server is met een stream socket.
Code:
if(  listen(sock,5) == SOCKET_ERROR  )
    printf("fout bij luisteren \n");

newsockfd = accept(sock, NULL, NULL);
if(  newsockfd == INVALID_SOCKET  )
    printf("fout bij accept");
Vervolgens kan je gegevens ontvangen en verzenden met de nieuwe socket newsockfd.


De server heeft poort 2001.
volgens deze regel
[cpp]cppprog.sin_port = htons(2001);[/cpp]

In Flash gebruik je echter poort 2000.
Code:
if (!socket.connect("127.0.0.1", 2000)) {
	trace("Connection failed!");
}
Dit zou ook 2001 moeten zijn.
 
Laatst bewerkt:
Heel erg bedankt! Ik heb de listen en accept functies na de bind functie gezet, ik neem aan dat dat klopt. Verder heb ik printf veranderd in cout maar dat lijkt me weinig consequenties hebben.
Voor ik hem can compilen doet hij nog moeilijk over 1 ding: wat voor type wordt newsockfd? Als ik er een int van maak heb ik (eindelijk!) verbinding, ik neem aan dat dat zo in orde is?

Dan de laatste stap, hoe roep ik 'aanslagen' op in Flash? Gezien de regel "sendto(sock, (char *) &aanslagen, sizeof(aanslagen), 0, (sockaddr *) &flashprog, sizeof(flashprog) );" wordt deze variabele verstuurd, maar hoe roep ik hem op?
 
Laatst bewerkt:
Voor newsockfd kan je int gebruiken. Er is in windows ook een speciaal type voor sockets nl.: SOCKET.
Gebruik gewoon het type dat je ook voor de variabele sock gebruikt.

Als je gebruik maakt van een stream socket kan je send() i.p.v. sendto() gebruiken. Die doen dan hetzelfde.
Controleer (voor zover nog niet gedaan) ook de return waarde van send(), zodat je weet of er iets is verstuurd of er misschien een fout is opgetreden.

Uitgaande van de link in mijn eerdere post zou de data die verstuurd wordt volgens een soort protocol moeten gaan.
Ik denk dat je de int dan eerst moet omzetten in een char array.
EDIT:
Heb nog wat rondgekeken op het web.
In Flash gebruik je dan bijv. XMLSocket.onData om iets met de ontvangen data te doen.
Het einde van een XMLmessage is een 0-byte, vergeet die niet mee te sturen als je send() aanroept.
 
Laatst bewerkt:
Als ik send() gebruik ipv sendto() krijg ik de error: Extra parameter in call to __stdcall send(unsigned int,const char *,int,int). Deze bevindt zich de volgende regel:
Code:
send(sock, (char *) &aanslagen, sizeof(aanslagen), 0, (sockaddr *) &flashprog, sizeof(flashprog) );
Daarnaast krijg ik de melding dat 'aanslagen' een value heeft die nooit wordt gebruikt.

Wat ik even niet begrijp is het XML gedeelte. Op deze pagina (http://thebackbutton.com/misc/f10api/flash/net/Socket.html) staat dat deze 'techniek' binairy is, en niet met xml werkt. Met socket.readInt() zou ik dus een waarde (aanslagen?) kunnen oproepen, maar hoe schrijf ik dit?
 
Bij send() gebruik je minder parameters Je hoeft dan niet aan te geven waar de data naar toe moet.
M.a.w. de variabele flashprog hoef je niet te gebruiken.
Code:
sendto(sock, (char *) &aanslagen, sizeof(aanslagen), 0, (sockaddr *) &flashprog, sizeof(flashprog) );
doet hetzelfde als
Code:
send(sock, (char *) &aanslagen, sizeof(aanslagen), 0 );
maar met sendto() mag het ook gewoon.
Voor het XML gedeelte in Flash zal ik even zoeken ik heb daar verder geen ervaring mee.

EDIT:
Die vraag over readInt() kan je misschien beter op een flash forum vragen. Let wel op dat in windows een int little-endian is en Flash gebruikt standaard big-endian.
misschien iets als
Code:
var aanslagen;
aanslagen = mysocket.readInt();
waarbij mysocket een Socket is die verbonden is met de server..

Is het nu zo dat je de Socket class en niet de XMLSocket class gebruikt?
 
Laatst bewerkt:
Ik gebruik nu inderdaad de 'gewone' Socket class. Aanslagen = readInt() werkt helaas niet, maar dan post ik wel iets daarover in het Flashforum, ik ga er even vanuit dat de huidige C++ code die ik heb gewoon werkt.
In ieder geval erg bedankt! :thumb:
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan