首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 媒体动画 > CAD教程 >

关于silverlight中TCP通信的策略服务器解决方法

2012-03-27 
关于silverlight中TCP通信的策略服务器我想让一个tcp的服务端与一个silverlight客户端进行通信,需要一个策

关于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[])
{
WSADATAwsaData;
SOCKETsListen,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访问服务器,connect之前会首先以短连接方式访问943端口,得到你输出的内容之后,就可以connect了。而服务器端943服务,一旦输出内容,就应该关闭连接,因为silverlight客户端下一次访问943时其实是重新连接的,而没有重复使用。如果服务器端不shutdown/close,其实很快你的服务器的cpu就变成100%并且也不支持客户端通讯了。
[解决办法]
说实在的,在服务器端同步、循环嵌套循环,这样的代码其实真的不应该做服务器系统开发。做个练习知道基本原理也许可以。做服务器系统开发,通常会使用到IOCP概念、异步概念,而不是这种“循环嵌套循环”的思路。

并且你写的代码循环代码太多了,就容易出问题。如果你利用人家千锤百炼的异步处理代码,不但你的代码可以节省一大半,而且也不容易出错。
[解决办法]
你想干啥?SL的策略服务必须是943,返回策略文件就可以了

标准流程是:SL请求服务器某个Socket服务,SL自动先请求该Socket服务器的943,请求成功后才会连接真正的服务

Socket是通用协议,无所谓服务端用什么

热点排行