因为Silverlight的安全机制,首先要访问服务器的943端口,接受策略文件比对,才能进行正常的Socket通信,所以服务器测试程序要开两个端口
943和4530(可以是其他的,不过有范围限定),两个线程。
/* if(myHandle) SuspendThread(myHandle);//挂起线程 if(myHandle) ResumeThread(myHandle);//恢复线程 if(myHandle) TerminateThread(myHandle,0);//终止线程 */ #include <windows.h> #include <iostream> #include <winsock2.h> //#include <socket.h> using namespace std; DWORD WINAPI acceptpoly(LPVOID argv);//声明一个线程函数 DWORD WINAPI acceptDate(LPVOID argv); SOCKET m_servSocketpoly; //poly Server SOCKET m_servSocket; SOCKET m_servSocketDate; //Date Server sockaddr_in clientAddr; //Date Client sockaddr_in polyAddr; //poly Client HANDLE mypolyThread; HANDLE myDateThread; int main(int argc,char *argv[]) { WSADATA wsa = {0}; if(WSAStartup(MAKEWORD(2,2),&wsa)) cout<<"DLL库失败\n"; string s; mypolyThread = CreateThread(NULL,acceptpoly,(LPVOID)0,NULL);//创建线程 myDateThread = CreateThread(NULL,acceptDate,NULL);//创建线程 SuspendThread(myDateThread);//挂起线程 while(1); return 0; } DWORD WINAPI acceptpoly(LPVOID argv) { if((m_servSocketpoly = socket(AF_INET,SOCK_STREAM,0))==INVALID_SOCKET) cout<<"poly Socket Creat Failed!\n"; sockaddr_in serverAddr; memset((char*)&serverAddr,sizeof(serverAddr)); serverAddr.sin_family = AF_INET; serverAddr.sin_port = htons(943); serverAddr.sin_addr.s_addr = htonl(INADDR_ANY); if(bind(m_servSocketpoly,(struct sockaddr*)&serverAddr,sizeof(serverAddr))) cout<<"poly Socket bind Failed!\n"; if(listen(m_servSocketpoly,8)!= 0) cout<<"poly Socket Listen Failed!\n"; cout<<"poly Prepared ALL Success!"<<endl; while(1) { char recvbuf[1000]; memset(recvbuf,1000); FILE *pfile = fopen("PolicyFile.xml","r"); assert(pfile != NULL); int lenAddr = sizeof(polyAddr); SOCKET _policy = accept(m_servSocketpoly,(struct sockaddr*)&polyAddr,&lenAddr); int len = recv(_policy,recvbuf,1000,0); if (memcmp(recvbuf,"<policy-file-request/>",sizeof("<policy-file-request/>"))==0) { cout<<"Send poly Success!\n"; memset(recvbuf,1000); int readCount = fread(recvbuf,sizeof(recvbuf),1,pfile); send(_policy,strlen(recvbuf),0); cout<<readCount<<" \n"<<recvbuf<<endl; fclose(pfile); ResumeThread(myDateThread); SuspendThread(mypolyThread);//挂起线程 } } } DWORD WINAPI acceptDate(LPVOID argv) ////Date { char recvbuf[1000]; memset(recvbuf,1000); if((m_servSocketDate = socket(AF_INET,0))==INVALID_SOCKET) cout<<"Date Socket Creat Failed!\n"; sockaddr_in serverAddr; memset((char*)&serverAddr,sizeof(serverAddr)); serverAddr.sin_family = AF_INET; serverAddr.sin_port = htons(4530); serverAddr.sin_addr.s_addr = htonl(INADDR_ANY); if(bind(m_servSocketDate,sizeof(serverAddr))) cout<<"Date Socket bind Failed!\n"; if(listen(m_servSocketDate,8)!= 0) cout<<"Date Socket Listen Failed!\n"; cout<<"Date Prepared ALL Success!"<<endl; while(1) { int lenAddr = sizeof(clientAddr); SOCKET _policy = accept(m_servSocketDate,(struct sockaddr*)&clientAddr,&lenAddr); for(;;) { cout<<"等待客户端数据\n"; int len = recv(_policy,0); cout<<"The length of Accept: "<<len<<endl; cout<<recvbuf<<endl; /*cout<<"该我发数据了:"<<endl; memset(recvbuf,1000); gets(recvbuf); send(_policy,0); */ } } }
策略文件
<?xml version="1.0" encoding ="utf-8"?> <access-policy> <cross-domain-access> <policy> <allow-from> <domain uri="*" /> </allow-from> <grant-to> <socket-resource port="4502-4534" protocol="tcp" /> </grant-to> </policy> </cross-domain-access> </access-policy>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。