2012-04-01 119 views
0

我正在用套接字構建一個自定義HTTP-Request類。我的代碼基於異步套接字的MSDN-Guid,但不幸的是它不起作用。要求運作良好,但我沒有收到完整的回覆。有人可以幫我解決這個問題嗎? 這是我的代碼:異步套接字不起作用

private void BeginConnect() 
{ 
    //Connect To Server 
    Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
    socket.BeginConnect(this.ResolveUrl(_requestUri), new AsyncCallback(this.ConnectCallback), socket); 
} 
private void ConnectCallback(IAsyncResult ar) 
{ 
    //Get Socket 
    Socket socket = (Socket)ar.AsyncState; 

    //Complete Connection 
    socket.EndConnect(ar); 

    //Send HTTP Request 
    byte[] requestBytes = this.CreateRequest(); 
    socket.BeginSend(requestBytes, 0, requestBytes.Length, SocketFlags.None, new AsyncCallback(this.SendCallback), socket); 
} 
private void SendCallback(IAsyncResult ar) 
{ 
    //Get Socket 
    Socket socket = (Socket)ar.AsyncState; 

    //Complete Sending 
    socket.EndSend(ar); 

    // Create the state object. 
    StateObject state = new StateObject(); 
    state.WorkSocket = socket; 

    //Recieve Response 
    socket.BeginReceive(state.Buffer, 0, StateObject.BufferSize, SocketFlags.None, new AsyncCallback(this.ReceiveCallback), state); 
} 
private void ReceiveCallback(IAsyncResult ar) 
{ 
    //Get StateObject 
    StateObject state = (StateObject)ar.AsyncState; 
    Socket socket = state.WorkSocket; 

    //Complete Receiving 
    int bytesRead = socket.EndReceive(ar); 
    if (bytesRead > 0) 
    { 
     //Save Already Received Data 
     state.ResponseBuilder.Append(Encoding.ASCII.GetString(state.Buffer, 0, bytesRead)); 

     //Get Rest Of The Data. 
     socket.BeginReceive(state.Buffer, 0, StateObject.BufferSize, SocketFlags.None, new AsyncCallback(this.ReceiveCallback), state); 
    } 
    else 
    { 
     if (state.ResponseBuilder.Length > 1) 
     { 
      //Shutdown Socket 
      socket.BeginDisconnect(false, new AsyncCallback(this.DisconnectCallback), state); 

      //Invoke Callback 
      SocketResponse resp = new SocketResponse(state.ResponseBuilder.ToString(), HttpStatusCode.Accepted); //TODO 
      _callback.Invoke(resp); 
     } 
    } 
} 
private void DisconnectCallback(IAsyncResult ar) 
{ 
    //Get Socket 
    StateObject state = (StateObject)ar.AsyncState; 
    Socket socket = state.WorkSocket; 

    //Shutdown Socket 
    socket.Shutdown(SocketShutdown.Both); 
    socket.Close(); 
} 
+0

我想這是通常的TCP問題。即它是TCP而不是基於消息的協議,因此發送呼叫可以被分成多個接收呼叫。一些潛在的重複[1](http://stackoverflow.com/q/5528234/445517)[2](http://stackoverflow.com/q/8575659/445517)[3](http:// stackoverflow。 com/q/9895132/445517) – CodesInChaos 2012-04-01 21:07:28

回答

0

TCP連接是基於流的。每次讀取的數據量都包含一個隨機性元素,您需要循環讀取,直到獲得完整的消息。

如果您沒有以前的網絡經驗,實現套接字是一種容易出錯的練習。話雖如此,所有這些問題都已在開源網絡通信庫networkComms.net中得到解決。如果您遵循非常基本的11行(例如here),您將看到如何正確實現異步套接字。

+0

兩個重要的缺點IMO 1)我無法找到協議規範2)GPL – CodesInChaos 2012-04-02 07:30:38