【问题标题】:Asynchronous Socket doesn't work异步套接字不起作用
【发布时间】:2012-04-01 21:02:59
【问题描述】:

我正在使用 Sockets 构建一个自定义 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();
}

【问题讨论】:

  • 我猜这是通常的 TCP 问题。即 TCP 是流而不是基于消息的协议,因此发送调用可以拆分为多个接收调用。一些潜在的重复123

标签: c# http sockets networking tcp


【解决方案1】:

TCP 连接是基于流的。您每次可以读取的数据量涉及随机性元素,您需要循环读取,直到获得完整的消息。

如果您以前没有网络经验,那么实施套接字是一个容易出错的练习。话虽如此,所有这些问题都在开源网络通信库networkComms.net 中得到了解决。如果您遵循非常基本的第 11 行,例如 here,一直沿调用树向下,您将看到如何正确实现异步套接字。

【讨论】:

  • IMO 的两个重大缺点 1) 我找不到协议规范 2) GPL
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-05
  • 1970-01-01
  • 1970-01-01
  • 2021-01-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多