因为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,0,acceptPoly,(LPVOID)0,0,NULL);//创建线程
myDateThread = CreateThread(NULL,0,acceptDate,(LPVOID)0,0,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, 0, 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, 0, 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, 0, 1000);
int readCount = fread(recvbuf, sizeof(recvbuf), 1, pfile);
send(_policy, recvbuf, 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, 0, 1000);
if((m_servSocketDate = socket(AF_INET, SOCK_STREAM, 0))==INVALID_SOCKET)
cout<<"Date Socket Creat Failed!\n";
sockaddr_in serverAddr;
memset((char*)&serverAddr, 0, sizeof(serverAddr));
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(4530);
serverAddr.sin_addr.s_addr = htonl(INADDR_ANY);
if(bind(m_servSocketDate, (struct sockaddr*)&serverAddr, 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, recvbuf, 1000, 0);
cout<<"The length of Accept: "<<len<<endl;
cout<<recvbuf<<endl;
/*cout<<"该我发数据了:"<<endl;
memset(recvbuf, 0, 1000);
gets(recvbuf);
send(_policy, recvbuf, strlen(recvbuf), 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>