• Flex Socket 安全沙箱问题解决


    Flex使用Socket与C++通讯时遇到了安全沙箱问题,NND,折腾我半天,这是我的解决方法:

     1):策略文件与主套接字在同一端口,只需调用 Socket.connect() 或 XMLSocket.connect() 方法; 

     2):策略文件与主套接字在不同端口,需使用特殊的“xmlsocket”语法调用 Security.loadPolicyFile() 方法,如下所示:Security.loadPolicyFile("xmlsocket://server.com:2525");先调用 Security.loadPolicyFile() 方法,然后再调用 

    Socket.connect() 或 XMLSocket.connect() 方法。

    服务器端代码如下:

    #include <winsock2.h>
    #include <windows.h>
    #include <iostream>
    using namespace std;
    #pragma comment(lib,"ws2_32.lib")
    
    void main()
    { 
    	WORD wVersionRequested;
    	WSADATA wsaData;
    	int err;
    	short port=1800;//端口号
    	
    	wVersionRequested = MAKEWORD( 1, 1 );
    	err = WSAStartup( wVersionRequested, &wsaData );//初始化套接字
    	if ( err != 0 )
    	{
    		return;
    	}
    	
    	if ( LOBYTE( wsaData.wVersion ) != 1 || HIBYTE( wsaData.wVersion ) != 1 )
    	{
    		WSACleanup( );
    		return;
    	}
    	
    	SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);//创建套接字
    	SOCKET sockConn;//用来和客户端通信的套接字
    	SOCKADDR_IN addrSrv;//用来和客户端通信的套接字地址
    	addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
    	addrSrv.sin_family=AF_INET;
    	addrSrv.sin_port=htons(port);
    	
    	bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));//绑定端口
    	listen(sockSrv,5);//侦听
    	
    	printf("Server %d is listening....../n",port);
    	
    	SOCKADDR_IN addrClient;
    	
    	int len=sizeof(SOCKADDR);
    	char buf[4096];//接收的数据
    	char rbuf[100]=
    		"<cross-domain-policy> "  
    		"<allow-access-from domain=/"*/" to-ports=/"*/"/>"  
    		"</cross-domain-policy> ";//套接字策略文件
    	
    	while(1)
    	{
            //接受连接
    		sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);
    		printf("Accept connection from %s/n",inet_ntoa(addrClient.sin_addr));
    		
    recv:
    		//接收数据
    		int bytes;
    		if((bytes=recv(sockConn,buf,sizeof(buf),0))==SOCKET_ERROR)
    		{
    			printf("接收数据失败!/n");
    			exit(-1);
    		}
    
    		buf[bytes]='/0';
    		printf("Message from %s: %s/n",inet_ntoa(addrClient.sin_addr),buf);		
    
    		if (0 == strcmp(buf,"<policy-file-request/>"))
    		{
    			//发送数据
    			if(send(sockConn,rbuf,strlen(rbuf)+1,0)==SOCKET_ERROR)
    			{
    				printf("发送数据失败!");
    				exit(-1);
    			}
    			printf("Message to %s: %s/n",inet_ntoa(addrClient.sin_addr),rbuf);
    		}
    		else
    		{
    			//Echo
    			if(send(sockConn,buf,strlen(buf)+1,0)==SOCKET_ERROR)
    			{
    				printf("发送数据失败!");
    				exit(-1);
    			}
    			printf("Message to %s: %s/n",inet_ntoa(addrClient.sin_addr),buf);
    			goto recv;
    		}
            //清理套接字占用的资源
            closesocket(sockConn);
    	}
    }
    

      

  • 相关阅读:
    postgresql查询栅格数据范围(extent)
    raster导入postgres Windows命令
    Python使用XML操作mapnik,实现复杂标注(Multi line text symbolizer)
    Leaflet使用vector tiles 标注label设置
    Leaflet使用vector tiles样式设置
    Leaflet调用geoserver发布的矢量切片
    java 生成透明背景图片
    java 用RGB生成图片动态命名
    POI拆分单元格,并设置拆分后第一个cell的值为空cell的值
    洛谷 P1003 铺地毯 题解
  • 原文地址:https://www.cnblogs.com/fuland/p/3854352.html
Copyright © 2020-2023  润新知