2009-09-11 35 views
0

我該如何着手在C#中製作套接字策略文件服務器。它所要做的就是在端口843上監聽字符串「< policy-file-request/>」,後跟一個NULL字節,然後返回一個XML字符串(這是套接字策略文件)。用於低級別AS3.0套接字連接的C#套接字策略文件服務器?

我還沒有編碼這種事情之前,不知道從哪裏開始。我是否在Windows服務中創建它?任何提示或鏈接都歡迎。

背景:

從接觸Flash web服務我使用的是 'as3httpclient' 庫,而不是將URLRequest /的URLLoader。這是因爲它使我能夠使用GET請求發送自定義標題。這個庫使用低級套接字來做它的東西。

當閃存使用低級套接字連接到服務器時,它會查找套接字策略文件 - 這需要由套接字策略文件服務器提供。

Socket Policy File Article from Adobe

+1

挖掘出我的實現... – spender 2009-09-11 08:50:20

+0

至於監聽「」,我認爲這將是更好地檢查包含單節點<政策性文件的XML - 請求/>,因爲這是規範實際上說的。 – spender 2009-09-11 09:40:06

+0

糟糕。看起來這就是你實際說的,但它被吞噬了。已修改您的帖子。 – spender 2009-09-11 11:06:42

回答

8

有幾件事情要注意使用建議的架構:

Trying to send an HTTP request over sockets

原則上,你需要注意的是,即使你可以使用套接字較低水平聊天HTTP ,這種方式的溝通會失敗的情況很多。如果用戶在其瀏覽器中啓用了代理服務器,則主要發生這些故障,因爲在通過套接字連接時沒有發現和隨後使用代理的有效方法。

爲了製作策略服務器,您可以使用TcpListener類。你會開始聽如下:

var tcpListener = new TcpListener(IPAddress.Any, 843); 
tcpListener.start(); 
tcpListener.BeginAcceptTcpClient(new AsyncCallback(NewClientHandler), null); 

的方法NewClientHandler將有以下形式:

private void NewClientHandler(IAsyncResult ar) 
    { 
     TcpClient tcpClient = tcpListener.EndAcceptTcpClient(ar); 
     ... 

在這一點上,你可能要到的TcpClient對象提供的一類自己的創作來處理的驗證來自套接字的數據。我將稱之爲RemoteClient。

在RemoteClient,你有這樣的事情:

var buffer=new byte[BUFFER_SIZE]; 
    tcpClient.GetStream().BeginRead(buffer, 0, buffer.Length, Receive, null); 

和接收方法:

private void Receive(IAsyncResult ar) 
    { 
     int bytesRead; 
     try 
     { 
      bytesRead = tcpClient.GetStream().EndRead(ar); 
     } 
     catch (Exception e) 
     { 

      //something bad happened. Cleanup required 
      return; 
     } 

     if (bytesRead != 0) 
     { 
      char[] charBuffer = utf8Encoding.GetChars(buffer, 0, bytesRead); 
      try 
      { 
       tcpClient.GetStream().BeginRead(buffer, 0, buffer.Length, Receive, null); 
      } 
      catch (Exception e) 
      { 
       //something bad happened. Cleanup required 
      } 
     } 
     else 
     { 
      //socket closed, I think? 
      return; 
     } 
    } 

和一些發送方法:

public void Send(XmlDocument doc) 
    { 
     Send(doc.OuterXml); 
    } 
    private void Send(String str) 
    { 

     Byte[] sendBuf = utf8Encoding.GetBytes(str); 
     Send(sendBuf); 
    } 
    private void Send(Byte[] sendBuf) 
    { 
     try 
     { 
      tcpClient.GetStream().Write(sendBuf, 0, sendBuf.Length); 
      tcpClient.GetStream().WriteByte(0); 
      tcpClient.GetStream().WriteByte(13); //very important to terminate XmlSocket data in this way, otherwise Flash can't read it. 

     } 
     catch (Exception e) 
     { 
      //something bad happened. cleanup? 
      return; 
     } 
    } 

這是所有重要的細節我想。我前一段時間寫過這個... Receive方法看起來可以用返工做,但它應該足以讓你開始。

+1

太好了 - 非常感謝代理問題上的問題。 – dan 2009-09-11 12:35:54

+0

只是要清楚 - 到SO問題的鏈接是關於追加額外的/ r/n。這與你在下一段提到的代理問題沒有任何關係嗎?這是兩個不同的問題需要注意? – dan 2009-09-11 12:41:24

+0

正確。代理問題是不同的。 – spender 2009-09-11 20:44:41

1

創建一個監聽套接字。

打開連接時,執行接收並等待預期的字符串。收到時發送文件內容,然後關閉套接字。

將其包裝在服務中(作爲低特權帳戶運行)。

大部分工作都是使用System.Net.Sockets.Socket類完成的,文檔中包含一個示例,該API與BSD套接字API非常相似(主要是從BSD API到Socket的1:1映射(或幫助類型)方法),所以任何背景都應該易於翻譯。

+0

+1作爲低權限帳戶建議在服務中運行。謝謝。 – dan 2009-09-11 12:38:09