Sergio Hidalgo
Sergio Hidalgo

Reputation: 51

Flash binary socket connection fails when serving the policy file from a port other than 843

I'm trying to setup a binary socket connection in Flash to a server other than the one the swf is being served from. Following Adobe's documentation on socket policy files, I serve this file from the 843 port of the target server:

<!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd"> 
<!-- Policy file for xmlsocket://socks.mysite.com --> 
<cross-domain-policy>  
    <allow-access-from domain="*" to-ports="6666" />  
</cross-domain-policy>

I then connect to the 6666 port with the following AS3 code:

sock.addEventListener(Event.CLOSE, closeHandler);
sock.addEventListener(Event.CONNECT, connectHandler);
sock.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
sock.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
sock.addEventListener(ProgressEvent.SOCKET_DATA, socketDataHandler);
sock.connect('myserver', 6666);

This works perfectly. But things go ugly when I try to serve the policy file from a port other than 843. If I set my policy file server to listen at port 6669, and change my Flash code adding this call before attempting the connection:

Security.loadPolicyFile("xmlsocket://myserver:6669");

.. then the connection will only work about half the time, and I'll get a Security error #2048 when it doesn't. I've checked in those instances, the policy file server doesn't even receive a request from the client to return the xml file.

The server code is exactly the same when serving from 843 or 6669. I've checked the null byte is being sent after the xml string, and I've also tried it with Adobe's sample policy file server, with the same results.

Upvotes: 4

Views: 738

Answers (1)

Sergio Hidalgo
Sergio Hidalgo

Reputation: 51

After using net analysis tools I found out the answer: Turns out Flash doesn't close the socket from the failed request to the 843, even after the 3 seconds timeout has passed.

The socket takes some more seconds to fully close. If you attempt to restablish the connection during that time, it will fail, even if you are using a different browser window.

Upvotes: 1

Related Questions