0

我有一个使用 SL4 的 silverlight 客户端和一个使用 .NET 4 的 C# 服务器。服务器在 4525 上打开一个端口,客户端打算连接到该端口。现在,如果我可以要求您简单地阅读以下内容,我们可能可以避免我不得不发布任何进一步的代码:

客户端尝试与服务器建立连接,打开策略文件的连接,请求策略文件,并返回策略文件。没有发生的是客户端中的 onConnect 事件。在我实现策略服务器之前,客户端会在 4525 上连接,并执行 onConnect 事件,但由于没有策略服务器而立即失败。现在我已经实现了策略服务器,它似乎永远不会检测到它的交付完成。

以下是传输摘要:

Client:
<policy-file-request/>
Server:
<?xml version="1.0" encoding ="utf-8"?>
<access-policy>
<cross-domain-access>
<policy>
<allow-from>
<domain uri="*:4525" />
</allow-from>
<grant-to>
<socket-resource port="4525" protocol="tcp" />
</grant-to>
</policy>
</cross-domain-access>
</access-policy>

有效; 我要回答的唯一问题是:我是否遗漏了我的保单文件中的某些内容,或者我是否需要以任何特定方式结束其向客户的提交,以便我的客户检测其交付?

Things of note:
    The Client successfully establishes its connection to the policy server
    The policy server successfully writes the policy back to the client
    The 'real' servers port is successfully opened
    The client 'can' connect to the 'real' server

谢谢大家的时间,我相信有人能提供帮助。

代码请求 客户端连接

不确定这对找到答案是否有任何进一步的影响;但:

private static DnsEndPoint IP_END_POINT = new DnsEndPoint("192.168.0.36", 4525, AddressFamily.InterNetwork);


public MainPage()
{
    try
    {
        InitializeComponent();

        socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        SocketAsyncEventArgs connectEventArgs = new SocketAsyncEventArgs();
        connectEventArgs.RemoteEndPoint = IP_END_POINT;
        connectEventArgs.Completed += new EventHandler<SocketAsyncEventArgs>(ConnectionEstablished);
        socket.ConnectAsync(connectEventArgs);
    }
    catch (Exception e)
    {
    }
}

新开发 “连接已建立”着火了!

所以事实证明,如果我想要一分钟左右,我的“ConnectionEstablished”事件最终会触发。然而,我从中得到的并不是那么令人鼓舞。

我最终得到了一个 SocketError 的“AccessDenied”,以及一条消息“试图以一种被其访问权限禁止的方式访问套接字。”,正如可以预料的那样,我的服务器从不接受连接。我知道服务器打开了端口,并且可以接受连接,所以这是相当令人困惑的场景。

再次感谢任何人的帮助。

4

1 回答 1

2

尝试:

private static DnsEndPoint IP_END_POINT = new DnsEndPoint("192.168.0.36", 4525, AddressFamily.InterNetwork);


public MainPage()
{
    try
    {
        InitializeComponent();

        socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        SocketAsyncEventArgs connectEventArgs = new SocketAsyncEventArgs();
        connectEventArgs.RemoteEndPoint = IP_END_POINT;
        connectEventArgs.Completed += new EventHandler<SocketAsyncEventArgs>(ConnectionEstablished);

        if(!socket.ConnectAsync(connectEventArgs))
        {
            ConnectionEstablished(/*Insert Args*/); //Handle real time execution
        }
    }
    catch (Exception e)
    {
        //write error somewhere
    }
}

文档表明如果返回 false ,ConnectAsync则“不会引发在 e 参数中传递的 System.Net.Sockets.SocketAsyncEventArgs 对象上的 SocketAsyncEventArgs.Completed 事件。”

此外,请确保您在某处记录异常。可能有一个例外,你只是轻而易举过去。

更新

  • 您是否检查了ClientAccessPolicy.xml文件?您需要将所有“和”字符替换为“。
  • 您是否尝试connectEventArgs.UserToken = socket;ConnectAsync(connectEventArgs)通话前添加?
  • 服务器是否收到请求并发送回复(可能需要在客户端使用Wireshark)?
  • 虽然调试确实connectEventArgs.Completed指向正确的方法?
  • 调试时,如果您“跳过”(F10)直到方法返回,会发生什么?是否调用了其他方法?
  • 调试时,如果您“跳过”(F10)socket.ConnectAsync(connectEventArgs)(但仍在该方法中),Debug>Windows>Threads 窗口中是否还有其他线程?如果切换到另一个线程会发生什么(右键单击线程并选择“切换到线程”或双击线程)?

让我知道结果如何。

于 2012-05-11T03:53:00.097 回答