2014-05-25 11 views
1

我已經通過網絡服務器異步套接字接收數據:c#獲取從瀏覽器發送的郵件表單數據,有時套接字會關閉。爲什麼?

var e = new SocketAsyncEventArgs(); 
      e.Completed += new EventHandler<SocketAsyncEventArgs>(e_Completed); 

while (true) 
       { allDone.Reset(); 
        mySocket.AcceptAsync(e); 
        allDone.WaitOne(); 
       } 

而另一種方法:

public void e_Completed(object sender, SocketAsyncEventArgs e) 
    { 
     var socket = (Socket)sender; 
     ThreadPool.QueueUserWorkItem(handleTcpRequest, e.AcceptSocket); 
     e.AcceptSocket = null; 
     socket.AcceptAsync(e); 
    } 

這是handleTcpRequest method.in這一部分,我收到來自插座的數據和做了手術:

public void handleTcpRequest(object state) 
{ 
    string sBuffer = ""; 
    string BufferTotal = ""; 
    byte[] secureMessage; 
    Byte[] bReceive = new Byte[1024]; 
    var mySocket = (Socket)state; 
      do 
      { 


        try 
        { 
        firstBufferRead = mySocket.Receive(bReceive, bReceive.Length, 0); 
        } 
        catch (Exception ex) 
        { 
        Console.WriteLine("Error Occurred (:))) " + ex.Message); 
        } 

       sBuffer += Encoding.GetEncoding(1252).GetString(bReceive, 0, firstBufferRead); 
       BufferTotal += Encoding.UTF8.GetString(bReceive, 0, firstBufferRead); 
      } while (mySocket.Available != 0); 
. 
. 
. 
. 
mySocket.Close(); 
} 

怎麼了? 有時連接重置並關閉。這發生在距離較遠或發佈數據不是多部分時。但在多部分發生很少。更多的形式不是多部分。 何時何地應關閉套接字? 當我在handleTcpRequest方法與它的本地套接字工作。這不正確嗎?我找不到問題的根源

+0

您正在使用異步IO,然後始終等待它完成。這比僅使用同步功能更復雜和更慢。僅供參考。 – usr

+0

您的錯誤處理只是繼續下去。這可能是錯誤的。你只會操作無效的數據。而是中止處理。 – usr

+0

不,不錯。當有人上傳一些文件或有長時間的請求時,其他人可以發送他們的請求。不要對這件事感到困惑 –

回答

0

要知道您已收到HTTP請求中的所有內容,唯一方法就是了解HTTP請求。而要了解一個HTTP請求,你必須選擇:

  1. 使用完整的HTTP服務器
  2. 創建一個HTTP解析器

的理由爲何多部分數據的代碼失敗可能是因爲對方一次只發送一個部分,這意味着您的代碼在發送其餘部分之前設法執行mySocket.Available != 0

如果你想要做後者,你必須閱讀HTTP頭(格式爲headerName: headervalue,請注意,也有你必須考慮的空白規則)。搜索名爲content-length的標頭,將其值作爲整數解析。然後等待連續兩行換行(\r\n\r\n)。最後開始計數字節,直到您收到content-length標頭中指定的字節數。

ohh .. ony more thing ..向上帝祈禱Transfer-Encoding: Chunked未被使用。

我的建議是,你放棄直接使用套接字,因爲很明顯你不明白它們是如何工作的或者如何對它們進行研究。

+0

嗨jgauffin。我很久以前就下載了你的網絡服務器和源代碼,並且很難理解。我會嘗試它,並希望能夠聯繫在一起更多 –

+0

我已經添加了代碼'code' while(!sBuffer.Contains(「\ r \ n \ r \ n」)); '代碼',但仍然是相同的錯誤 –

+0

C#有一個內置的類:HttpListener – jgauffin

相關問題