关于silverlight中TCP通信的策略服务器解决方法
关于silverlight中TCP通信的策略服务器
我想让一个tcp的服务端与一个silverlight客户端进行通信,需要一个策略服务器,请问各位大侠,这个策略服务器能用C++写吗?我的服务端的代码是用C++写的。下面是我用vc写的策略服务器的代码,但是好像silverlight客户端连接不上,不知道什么原因,请各位大侠指点:
#include "stdafx.h"
#include <WinSock2.h>
#include <string>
#include <iostream>
#include <stdio.h>
using namespace std;
#pragma comment(lib,"ws2_32.lib")
int _tmain(int argc, _TCHAR* argv[])
{
WSADATA wsaData;
SOCKET sListen,sAccept;
string policy_str = "<policy-file-request/>";
int isize = policy_str.length();
char recvbuf[12] = {0};//接受缓冲区
struct sockaddr_in local,from;//服务器和客户的地址
if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0)
{
printf("Failed to load Winsock.%d\n",WSAGetLastError());
return -1;
}
sListen = socket(AF_INET,SOCK_STREAM,0);//创建服务器端套接口
if(sListen == INVALID_SOCKET)
{
printf("socket() Failed: %d\n",WSAGetLastError());
return -1;
}
//以下建立服务器端地址//使用IP地址族
local.sin_family = AF_INET;
local.sin_port = htons(943);
local.sin_addr.S_un.S_addr = inet_addr("192.168.145.63");
//bind()函数进行套接定与地址的绑定
int err = bind(sListen,(SOCKADDR*)&local,sizeof(SOCKADDR));
if( err== SOCKET_ERROR)
{
printf("bind() Failed: %d\n",WSAGetLastError());
return -1;
}
//进入监听状态
if(listen(sListen,5) == SOCKET_ERROR)
{
printf("lisiten() Failed: %d\n",WSAGetLastError());
return -1;
}
//初始化客户地址长度参数
cout<<"==========policy server started!=========="<<endl;
int iLen = sizeof(from);
while(1) //进入一个无限循环,等待客户的连接请求
{
sAccept = accept(sListen,(struct sockaddr *)&from,&iLen);
if(sAccept == INVALID_SOCKET)
{
printf("accept() Failed: %d\n",WSAGetLastError());
return -1;
}
//输出客户IP地址和端口号
printf("Accepted client IP:[%s],port:[%d]\n",inet_ntoa(from.sin_addr),ntohs(from.sin_port));
while(true)
{
recv(sAccept,recvbuf,isize,0);
string str(recvbuf);
cout<<"接收到字符串是"<<str<<endl;
if(str == policy_str)
{
FILE *stream = NULL;
stream = fopen("D:\\PolicyFile.xml","r");
BYTE sendBuf[400] = {0};
fread(sendBuf,1,373,stream);
int isend = send(sAccept,(char*)sendBuf,373,0);
fclose(stream);
cout<<"have send out policy file "<<isend<<endl;
}else{
continue;
}
}
}
}
下面是我的策略文件:
<?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>
------解决方案--------------------
943端口是sl4之前使用的。现在已经使用80端口了。所以你现在这个没有用。如果你用C++写,还需要注意是否有权限注册80端口。和注册80端口前判断是否已经被其它程序占用
------解决方案--------------------
若要使用 TCP 和端口 943 检索套接字策略文件,应用程序应在传递给 ConnectAsync 方法的 SocketAsyncEventArgs 实例上将 SocketAsyncEventArgs.SocketClientAccessPolicyProtocol 属性设置为 SocketClientAccessPolicyProtocol.Tcp
------解决方案--------------------
应该可以的吧。 标准的套接口啊,你用其他程序看看行不,还有就是安全方面的设置
我想让一个tcp的服务端与一个silverlight客户端进行通信,需要一个策略服务器,请问各位大侠,这个策略服务器能用C++写吗?我的服务端的代码是用C++写的。下面是我用vc写的策略服务器的代码,但是好像silverlight客户端连接不上,不知道什么原因,请各位大侠指点:
#include "stdafx.h"
#include <WinSock2.h>
#include <string>
#include <iostream>
#include <stdio.h>
using namespace std;
#pragma comment(lib,"ws2_32.lib")
int _tmain(int argc, _TCHAR* argv[])
{
WSADATA wsaData;
SOCKET sListen,sAccept;
string policy_str = "<policy-file-request/>";
int isize = policy_str.length();
char recvbuf[12] = {0};//接受缓冲区
struct sockaddr_in local,from;//服务器和客户的地址
if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0)
{
printf("Failed to load Winsock.%d\n",WSAGetLastError());
return -1;
}
sListen = socket(AF_INET,SOCK_STREAM,0);//创建服务器端套接口
if(sListen == INVALID_SOCKET)
{
printf("socket() Failed: %d\n",WSAGetLastError());
return -1;
}
//以下建立服务器端地址//使用IP地址族
local.sin_family = AF_INET;
local.sin_port = htons(943);
local.sin_addr.S_un.S_addr = inet_addr("192.168.145.63");
//bind()函数进行套接定与地址的绑定
int err = bind(sListen,(SOCKADDR*)&local,sizeof(SOCKADDR));
if( err== SOCKET_ERROR)
{
printf("bind() Failed: %d\n",WSAGetLastError());
return -1;
}
//进入监听状态
if(listen(sListen,5) == SOCKET_ERROR)
{
printf("lisiten() Failed: %d\n",WSAGetLastError());
return -1;
}
//初始化客户地址长度参数
cout<<"==========policy server started!=========="<<endl;
int iLen = sizeof(from);
while(1) //进入一个无限循环,等待客户的连接请求
{
sAccept = accept(sListen,(struct sockaddr *)&from,&iLen);
if(sAccept == INVALID_SOCKET)
{
printf("accept() Failed: %d\n",WSAGetLastError());
return -1;
}
//输出客户IP地址和端口号
printf("Accepted client IP:[%s],port:[%d]\n",inet_ntoa(from.sin_addr),ntohs(from.sin_port));
while(true)
{
recv(sAccept,recvbuf,isize,0);
string str(recvbuf);
cout<<"接收到字符串是"<<str<<endl;
if(str == policy_str)
{
FILE *stream = NULL;
stream = fopen("D:\\PolicyFile.xml","r");
BYTE sendBuf[400] = {0};
fread(sendBuf,1,373,stream);
int isend = send(sAccept,(char*)sendBuf,373,0);
fclose(stream);
cout<<"have send out policy file "<<isend<<endl;
}else{
continue;
}
}
}
}
下面是我的策略文件:
<?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>
------解决方案--------------------
943端口是sl4之前使用的。现在已经使用80端口了。所以你现在这个没有用。如果你用C++写,还需要注意是否有权限注册80端口。和注册80端口前判断是否已经被其它程序占用
------解决方案--------------------
若要使用 TCP 和端口 943 检索套接字策略文件,应用程序应在传递给 ConnectAsync 方法的 SocketAsyncEventArgs 实例上将 SocketAsyncEventArgs.SocketClientAccessPolicyProtocol 属性设置为 SocketClientAccessPolicyProtocol.Tcp
------解决方案--------------------
应该可以的吧。 标准的套接口啊,你用其他程序看看行不,还有就是安全方面的设置