2012-04-01 57 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