2011-11-07 36 views
0

我試圖建立一個簡單的C#TCP代理爲自己的公司,所以我可以從我的員工屏蔽特定網站。一切都很好,除了我無法看到用戶正試圖訪問什麼網站...我可以看到用戶已連接到我的代理服務器,所以我知道我正在連接,但OnRecieve回調甚至沒有解僱。我從插座讀取錯了嗎?建立一個C#異步TCP代理服務器

這裏是我的代碼:

internal class AsyncState 
{ 
    public const int BufferSize = 4096; 
    public byte[] Buffer = new byte[AsyncState.BufferSize]; 
    public Socket Socket; 
    public StringBuilder Content = new StringBuilder(); 
} 

private void OnLoad(object sender, EventArgs e) 
{ 
    IPAddress[] addressCollection = Dns.GetHostAddresses(Dns.GetHostName()); 
    foreach (IPAddress ipAddress in addressCollection) 
    { 
     if (ipAddress.AddressFamily == AddressFamily.InterNetwork) 
     { 
      localEndPoint = new IPEndPoint(ipAddress, 8080); 
      Console.WriteLine("Local IP address found... " + localEndPoint.ToString()); 
      break; 
     } 
    } 

    isListening = true; 

    thread = new Thread(new ThreadStart(
     delegate() 
     { 
      serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
      serverSocket.Bind(localEndPoint); 
      serverSocket.Listen(10); 

      while (isListening) 
      { 
       resetEvent.Reset(); 

       Console.WriteLine("Waiting for clients..."); 
       serverSocket.BeginAccept(new AsyncCallback(OnAccept), serverSocket); 

       resetEvent.WaitOne(); 
       } 
      })); 

     thread.Start(); 
    } 
} 

private void OnAccept(IAsyncResult result) 
{ 
    resetEvent.Set(); 

    Socket clientSocket = (result.AsyncState as Socket).EndAccept(result); 
    Console.WriteLine("Client has connected... " + clientSocket.RemoteEndPoint.ToString()); 

    AsyncState state = new AsyncState(); 
    state.Socket = clientSocket; 
    state.Socket.BeginReceive(state.Buffer, 0, AsyncState.BufferSize, SocketFlags.None, new AsyncCallback(OnRecieve), state); 
} 

private void OnRecieve(IAsyncResult result) 
{ 
    AsyncState state = result.AsyncState as AsyncState; 

    int totalRead = state.Socket.EndReceive(result); 
    if (totalRead > 0) 
    { 
     state.Content.Append(Encoding.ASCII.GetString(state.Buffer, 0, totalRead)); 
     state.Socket.BeginReceive(state.Buffer, 0, AsyncState.BufferSize, SocketFlags.None, new AsyncCallback(OnRecieve), state); 
    } 
    else 
    { 
     if (state.Content.Length > 1) 
      Console.WriteLine("Message recieved from client... " + state.Content.ToString()); 

     state.Socket.Close(); 
    } 
} 
+8

我幾乎覺得我不能回答,爲您的員工着想。老闆之前的兄弟! – Polynomial

+0

我了投你只是因爲我理解你的心情胸罩;)但不幸的是,這是真實的世界和我的一些員工享受色情網站遠離家園哈哈 –

+0

沒有錯,一點pr0n;) – Polynomial

回答

5

全面建設小康工作代理沒有簡單的任務,你必須認識和處理HTTP等在兩個方向...

我會建議無論是使用一個現有的庫或一些配置代理...

備註:

我不知道在哪個管轄你,但在某些地方使用這種技術沒有知識/同意可員工的是一個問題......

還有一點:不要使用這種方法我會告訴員工停止濫用該公司的互聯網連接1-3倍,如果沒有工作我寧願解僱那個人......這些員工不僅濫用公司的互聯網連接,而且最壞的情況是讓公司處於危險之中(病毒/特洛伊木馬等)並且欺騙公司(如果他在工作中這樣做的話)小時)...

+0

我有一個深諳理解HTTP請求及其狀態(我設計Web應用程序)。我只需要知道如何捕捉請求的請求或HEAD這樣我就可以看到狀態,用戶代理等,並找出他們正試圖之前先查看我發送一個響應返回到瀏覽器 –

+0

@CrisMcLaughlin然後看什麼網站在上面的第2條鏈接中的來源...... – Yahia

+0

我們再次讓每個員工都簽署了互聯網使用協議,我不希望他們繼續,但爲了其他目的,如安全性,僅僅爲了我自己的知識和好奇心,我仍然喜歡學習如何做到這一點。知識就是力量,我只是愛編程:) –