| |||||||
Du magst keine Werbung? Wir auch nicht!
Einfach registrieren und die Werbung ist weg. Diese Nachricht sehen nur nicht registrierte Nutzer.
![]() |
| | LinkBack | Themen-Optionen | Ansicht |
| | #1 (permalink) |
| Neuer User Registriert seit: Sep 2008
Beiträge: 7
|
Hallo Leute, ich versuche schon seit Tagen meinen Flash-Client und meinen C-Server zu verkuppeln, aber die wollen leider nicht ganz. Der C-Server klappt zusammen mit einem C-Client einwandfrei. Wenn ich Flash aus der Entwicklerumgebung heraus starte, kommt die Verbindung zu stande und der Client kann auch senden. Nun habe ich schon erfahren, dass man auf den <policy-file-request> von Flash entsprechend reagieren muss, aber egal was ich gemacht habe, es hat meinen Flash-Client leider nicht zufrieden gestellt! Habe den Request auf Port 843 und Port 12345 beantwortet, trotzdem wartete das Flash-Script die 3 Sekunden Timeout ab und brach die Verbindung ab. Ein Versuch war zB. so: Code: <?xml version="1.0" encoding="UTF-8"?> <cross-domain-policy xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://www.adobe.com/xml/schemas/PolicyFileSocket.xsd"><allow-access-from domain="*" to-ports="*" secure="false" /> <site-control permitted-cross-domain-policies="master-only" /> </cross-domain-policy> ![]() Muss ich einen Header mitsenden oder nur das was ein paar Zeilen höher steht? Wegen eventuellen Nachfragen folgen die Quellcodes vom Flash-Client und C-Server: Der Flash-Client: Code: var xml_s=new XMLSocket();
var ip:String;
var port:Number;
ip="localhost";
port=12345;
//System.security.loadPolicyFile ("xmlsocket://localhost:12345");
xml_s.addEventListener(Event.CONNECT,xmlsocket);//OnConnect//
xml_s.addEventListener(Event.CLOSE,xmlsocket);//OnDisconnect//
xml_s.addEventListener(IOErrorEvent.IO_ERROR,xmlsocket);//Unable To Connect//
xml_s.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
xml_s.addEventListener(ProgressEvent.SOCKET_DATA, socketDataHandler);
xml_s.connect(ip,port);
function xmlsocket(Event):void
{
switch(Event.type)
{
case 'IOError':
//Unable to Connect :(//
trace("Error");
break;
case 'connect':
//Connected :)//
trace("Connected!");
break;
case 'close':
//OnDisconnect :( //
trace("Connection closed!");
break;
}
}
function securityErrorHandler()
{
trace("Security Error!");
}
function socketDataHandler()
{
trace("DatenHandler: "+ProgressEvent.SOCKET_DATA+"!");
}
xml_s.send("MESSAGE HERE"); Code: #include <windows.h>
#include <winsock.h>
#include <stdio.h>
#define MAX_CLIENTS 10
int startWinsock(void)
{
WSADATA wsa;
return WSAStartup(MAKEWORD(2,0),&wsa);
}
int main()
{
long rc;
SOCKET acceptSocket;
SOCKADDR_IN addr;
char buf[256];
char buf2[300];
// zustzliche Variabeln
FD_SET fdSet;
SOCKET clients[MAX_CLIENTS];
int i;
// Winsock starten
rc=startWinsock();
if(rc!=0)
{
printf("Fehler: startWinsock, fehler code: %d\n",rc);
}
else
{
printf("Winsock gestartet!\n");
}
// Socket erstellen
acceptSocket=socket(AF_INET,SOCK_STREAM,0);
if(acceptSocket==INVALID_SOCKET)
{
printf("Fehler: Der Socket konnte nicht erstellt werden, fehler code: %d\n",WSAGetLastError());
}
else
{
printf("Socket erstellt!\n");
}
// Socket binden
memset(&addr,0,sizeof(SOCKADDR_IN));
addr.sin_family=AF_INET;
addr.sin_port=htons(12345);
addr.sin_addr.s_addr=INADDR_ANY; // gewisse compiler brauchen hier ADDR_ANY
rc=bind(acceptSocket,(SOCKADDR*)&addr,sizeof(SOCKADDR_IN));
if(rc==SOCKET_ERROR)
{
printf("Fehler: bind, fehler code: %d\n",WSAGetLastError());
return 1;
}
else
{
printf("Socket an port 12345 gebunden\n");
}
// In den listen Modus
rc=listen(acceptSocket,10);
if(rc==SOCKET_ERROR)
{
printf("Fehler: listen, fehler code: %d\n",WSAGetLastError());
return 1;
}
else
{
printf("acceptSocket ist im listen Modus....\n");
}
for(i=0;i<MAX_CLIENTS;i++)
{
clients[i]=INVALID_SOCKET;
}
while(1)
{
FD_ZERO(&fdSet); // Inhalt leeren
FD_SET(acceptSocket,&fdSet); // Den Socket der verbindungen annimmt hinzufgen
// alle gltigen client sockets hinzufgen (nur die die nicht INVALID_SOCKET sind)
for(i=0;i<MAX_CLIENTS;i++)
{
if(clients[i]!=INVALID_SOCKET)
{
FD_SET(clients[i],&fdSet);
}
}
rc=select(0,&fdSet,NULL,NULL,NULL); // nicht vergessen den ersten parameter bei anderen betriebssystem anzugeben
if(rc==SOCKET_ERROR)
{
printf("Fehler: select, fehler code: %s\n",WSAGetLastError());
}
// acceptSocket is im fd_set? => verbindung annehmen (sofern es platz hat)
if(FD_ISSET(acceptSocket,&fdSet)) {
// einen freien platz fr den neuen client suchen, und die verbingung annehmen
for(i=0;i<MAX_CLIENTS;i++)
{
if(clients[i]==INVALID_SOCKET)
{
clients[i]=accept(acceptSocket,NULL,NULL);
printf("Neuen Client angenommen (%d)\n",i);
break;
}
}
}
// prfen welcher client sockets im fd_set sind
for(i=0;i<MAX_CLIENTS;i++)
{
if(clients[i]==INVALID_SOCKET)
{
continue; // ungltiger socket, d.h. kein verbunder client an dieser position im array
}
if(FD_ISSET(clients[i],&fdSet))
{
rc=recv(clients[i],buf,256,0);
// prfen ob die verbindung geschlossen wurde oder ein fehler auftrat
if(rc==0 || rc==SOCKET_ERROR)
{
printf("Client %d hat die Verbindung geschlossen\n",i);
closesocket(clients[i]); // socket schliessen
clients[i]=INVALID_SOCKET; // seinen platz wieder freigeben
}
else
{
buf[rc]='\0';
// daten ausgeben und eine antwort senden
printf("Client %d hat folgendes gesandt: %s\n",i,buf);
if (!strcmp("<policy-file-request/>",buf))
{
sprintf(buf2,"<?xml version=\"1.0\"?><!DOCTYPE cross-domain-policy SYSTEM \"http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd\"><cross-domain-policy> <allow-access-from domain=\"*\" /></cross-domain-policy>\0");
printf("senden zurueck: '%s'!\n",buf2);
} else
{
// antwort senden
sprintf(buf2,"Du mich auch %s\0",buf);
printf("senden zurueck: '%s'!\n",buf2);
}
send(clients[i],buf2,(int)strlen(buf2),0);
}
}
}
}
} ![]() Vielen Dank schon im Vorraus! Gruß Samsara |
| | |
| | #5 (permalink) |
| Neuer User Registriert seit: Sep 2008
Beiträge: 7
|
Danke Gnut dass du es dir angesehen hast, aber das Problem lag an anderer Stelle! Habe das Problem gelöst!! Was war das Problem? Kurzform: - Falscher Aufruf der Flash-Datei im HTML-Quelltest - gesendete Daten wurden nicht mit Zeichen 0 (NULL) abgeschlossen Das mit dem Zeichen NULL habe ich schon versucht zu erzwingen, aber ein String wird eh immer mit diesem Zeichen beendet. Nur leider wurde dieses Zeichen nicht mitgesendet (siehe ganz unten im C-Quelltext): Falsche Variante: send(clients[i],buf2,(int)strlen(buf2),0); Richtige Variante: send(clients[i],buf2,(int)strlen(buf2)+1,0); -.- Die von Macromedia Flash generierte HTML-Seite war wohl mistig. Mit folgendem Quelltext braucht man anscheinend keine policy-request-Behandlung zu machen: Code: ...<embed src="xmlSocket.swf" FlashVars="" play="true" loop="true" menu="false" quality="best" width="550" height="400" name="DFlash" allowScriptAccess="sameDomain" swLiveConnect="true" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" bgcolor="#000000" />... Musste die policy-request-geschichte doch reinmachen, aber die funktioniert einwandfrei mit: Code: printf("Client %d hat folgendes gesandt: %s\n",i,buf);
if (!strcmp("<policy-file-request/>",buf))
{
sprintf(buf2,"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<cross-domain-policy xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:noNamespaceSchemaLocation=\"http://www.adobe.com/xml/schemas/PolicyFile.xsd\">\n <site-control permitted-cross-domain-policies=\"all\"/>\n <allow-access-from domain=\"*\" to-ports=\"*\"/>\n</cross-domain-policy>");
printf("senden zurueck: '%s'!\n",buf2);
} else
{
// antwort senden
sprintf(buf2,"Du mich auch %s",buf);
printf("senden zurueck: '%s'!\n",buf2);
}
send(clients[i],buf2,(int)strlen(buf2)+1,0); Habe nun einen anderen Flash-Quelltext: Code: mySocket = new XMLSocket();
mySocket.onConnect = function(success)
{
if (success)
msgArea.htmlText += "<b>Server connection established!</b>"
else
msgArea.htmlText += "<b>Server connection failed!</b>"
}
mySocket.onClose = function()
{
msgArea.htmlText += "<b>Server connection lost</b>"
}
mySocket.connect("localhost", 12345);
mySocket.onData = function(msg:String):Void
{
msgArea.htmlText +="empfange:"+msg+"!<br>";
}
//--- Handle button click --------------------------------------
function sendMsg()
{
if (inputMsg.htmlText != "")
{
mySocket.send(inputMsg.htmlText + "\n");
msgArea.htmlText +="gesendet!";
}
} Das war's schon ![]() Endlich kann ich nun Senden um Empfangen. Nun kann's weiter gehen :] Gruß Samsara Geändert von samsara (17-11-2008 um 01:06 Uhr) |
| | |
| | #7 (permalink) |
| aus Berlin Registriert seit: Feb 2002 Ort: Berlin
Beiträge: 516
|
Hi, hast du dein Problem schon gelöst ? Ich habe mal eigene XMLSocket Server mit С# programmiert und hatte ähnliche Probleme die ich aber gelöst habe, frag mich nicht wie aber, wenn du die Hilfe brauchst sag Bescheid ich suche meine Backups mal durch und sage woran es liegt |
| | |
![]() |
| Lesezeichen |
| Themen-Optionen | |
| Ansicht | |
| |