• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            Flex Socket 與 C++ 通訊 --- 安全沙箱問(wèn)題解決

            最近一個(gè)項(xiàng)目的客戶端要改成Flex,使用Socket與C++通訊時(shí)遇到了安全沙箱問(wèn)題,這是我的解決方法;

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

            2):策略文件與主套接字在不同端口,需使用特殊的“xmlsocket”語(yǔ)法調(diào)用 Security.loadPolicyFile() 方法,如下所示:

            Security.loadPolicyFile("xmlsocket://server.com:2525");

            先調(diào)用 Security.loadPolicyFile() 方法,然后再調(diào)用 Socket.connect() 或 XMLSocket.connect() 方法。

            測(cè)試代碼:使用同一端口

            view plaincopy to clipboardprint?
            #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;//端口號(hào)  
                  
                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);//創(chuàng)建套接字  
                SOCKET sockConn;//用來(lái)和客戶端通信的套接字  
                SOCKADDR_IN addrSrv;//用來(lái)和客戶端通信的套接字地址  
                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];//接收的數(shù)據(jù)  
                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:  
                    //接收數(shù)據(jù)  
                    int bytes;  
                    if((bytes=recv(sockConn,buf,sizeof(buf),0))==SOCKET_ERROR)  
                    {  
                        printf("接收數(shù)據(jù)失敗!\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/>"))  
                    {  
                        //發(fā)送數(shù)據(jù)  
                        if(send(sockConn,rbuf,strlen(rbuf)+1,0)==SOCKET_ERROR)  
                        {  
                            printf("發(fā)送數(shù)據(jù)失敗!");  
                            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("發(fā)送數(shù)據(jù)失敗!");  
                            exit(-1);  
                        }  
                        printf("Message to %s: %s\n",inet_ntoa(addrClient.sin_addr),buf);  
                        goto recv;  
                    }  
                    //清理套接字占用的資源  
                    closesocket(sockConn);  
                }  
            }
            #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;//端口號(hào)

            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);//創(chuàng)建套接字
            SOCKET sockConn;//用來(lái)和客戶端通信的套接字
            SOCKADDR_IN addrSrv;//用來(lái)和客戶端通信的套接字地址
            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];//接收的數(shù)據(jù)
            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:
               //接收數(shù)據(jù)
               int bytes;
               if((bytes=recv(sockConn,buf,sizeof(buf),0))==SOCKET_ERROR)
               {
                printf("接收數(shù)據(jù)失敗!\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/>"))
               {
                //發(fā)送數(shù)據(jù)
                if(send(sockConn,rbuf,strlen(rbuf)+1,0)==SOCKET_ERROR)
                {
                 printf("發(fā)送數(shù)據(jù)失敗!");
                 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("發(fā)送數(shù)據(jù)失敗!");
                 exit(-1);
                }
                printf("Message to %s: %s\n",inet_ntoa(addrClient.sin_addr),buf);
                goto recv;
               }
                    //清理套接字占用的資源
                    closesocket(sockConn);
            }
            }

             

            無(wú)論是哪種情況,服務(wù)器均必須等待客戶端的第一次傳輸之后再?zèng)Q定是發(fā)送策略文件還是建立主連接。當(dāng) Flash Player 請(qǐng)求策略文件時(shí),它始終會(huì)在建立連接后傳輸以下字符串:

            <policy-file-request/>
            服務(wù)器收到此字符串后,即會(huì)傳輸該策略文件。程序?qū)τ诓呗晕募?qǐng)求和主連接并不會(huì)使用同一連接,因此應(yīng)在傳輸策略文件后關(guān)閉連接。如果不關(guān)閉連接,F(xiàn)lash Player 將關(guān)閉策略文件連接,之后重新連接以建立主連接。

            附網(wǎng)絡(luò)資料:

            1,首先檢測(cè)目標(biāo)服務(wù)器的843端口是否提供安全策略
            2,如果1沒有檢測(cè)到策略,則檢測(cè)actionscript是否使用了Security.loadPolicyFile(xmlsocket://) 手段提供安全策略,如果還沒檢測(cè)到,則使用第3步檢測(cè)
            3,檢測(cè)目標(biāo)服務(wù)器目標(biāo)端口是否提供安全策略

             

            本文來(lái)自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:http://blog.csdn.net/xuxiangwin/archive/2009/07/07/4324218.aspx

            Feedback

            # re: [轉(zhuǎn)]Flex Socket 與 C++ 通訊 --- 安全沙箱問(wèn)題解決  回復(fù)  更多評(píng)論   

            2011-03-16 13:40 by 小不點(diǎn)
            偽指令#pragma pack (n),C編譯器將按照n個(gè)字節(jié)對(duì)齊。
            偽指令#pragma pack (),取消自定義字節(jié)對(duì)齊方式。

            # re: [轉(zhuǎn)]Flex Socket 與 C++ 通訊 --- 安全沙箱問(wèn)題解決  回復(fù)  更多評(píng)論   

            2011-03-19 21:47 by NO
            關(guān)注:

            Shut up 2011-3-9 21:03:57
            http://tech.ddvip.com/2008-12/122855295598098.html
            Shut up 2011-3-9 21:04:04
            http://www.codeproject.com/KB/IP/iocp_server_client.aspx
            Shut up 2011-3-10 14:03:14
            http://blog.csdn.net/Solstice/category/793463.aspx
            Shut up 2011-3-11 19:42:06
            http://blog.csdn.net/guestcode/category/569314.aspx
            九九99精品久久久久久| 思思久久好好热精品国产| 精品久久久久久无码不卡| 久久99国产精品99久久| 久久国产乱子伦免费精品| 成人久久免费网站| 青草国产精品久久久久久| 亚洲中文字幕无码久久综合网| 思思久久好好热精品国产| 久久久久久国产a免费观看黄色大片 | 久久强奷乱码老熟女网站| 久久综合久久性久99毛片| 伊人久久五月天| 性做久久久久久久| 久久狠狠高潮亚洲精品| 欧美久久综合性欧美| 合区精品久久久中文字幕一区| 久久综合伊人77777麻豆| 久久精品国产亚洲αv忘忧草 | 久久久久人妻一区二区三区| 伊人久久大香线蕉综合Av| 99久久精品影院老鸭窝| 中文字幕久久欲求不满| 亚洲午夜无码久久久久小说| 亚洲国产另类久久久精品黑人| 久久国产精品99精品国产987| 欧美久久亚洲精品| 无码超乳爆乳中文字幕久久| 国产精品va久久久久久久| 国产69精品久久久久APP下载| jizzjizz国产精品久久| 国产精品亚洲综合专区片高清久久久| 亚洲人成电影网站久久| jizzjizz国产精品久久| 麻豆精品久久久久久久99蜜桃 | 国产精品久久久久久一区二区三区| 久久99精品国产99久久| 无码人妻久久一区二区三区免费 | 国产精品久久久久久久久久免费| 无码人妻少妇久久中文字幕| 精品综合久久久久久97超人|