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)
    {
    }
}

新開発 「コネクション確立」発火!

したがって、1 分ほど時間があれば、「ConnectionEstablished」イベントが最終的に発生することがわかりました。しかし、そこから得られるものはそれほど心強いものではありません。

「AccessDenied」の SocketError と「アクセス許可によって禁止されている方法でソケットにアクセスしようとしました。」というメッセージが表示され、予想どおり、サーバーは接続を受け入れません。サーバーのポートが開いていて、接続を受け入れることができることはわかっているので、これは非常に複雑なシナリオです。

誰の助けにも感謝します。

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)(ただしメソッド内にある) 場合、[デバッグ] > [Windows] > [スレッド] ウィンドウに他のスレッドがありますか? 別のスレッドに切り替えるとどうなりますか (スレッドを右クリックして [スレッドに切り替え] を選択するか、スレッドをダブルクリックします)。

物事がどうなるか教えてください。

于 2012-05-11T03:53:00.097 に答える