C# 异步套接字不';行不通
我正在用套接字构建一个自定义HTTP请求类。我的代码基于异步套接字的MSDN Guid,但毫无疑问,它不起作用。请求运行良好,但我没有收到完整的响应。也许有人能帮我解决这个问题吗? 这是我的密码:C# 异步套接字不';行不通,c#,http,sockets,networking,tcp,C#,Http,Sockets,Networking,Tcp,我正在用套接字构建一个自定义HTTP请求类。我的代码基于异步套接字的MSDN Guid,但毫无疑问,它不起作用。请求运行良好,但我没有收到完整的响应。也许有人能帮我解决这个问题吗? 这是我的密码: private void BeginConnect() { //Connect To Server Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
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连接是基于流的。您每次可以读取的数据量包含随机性元素,您需要在读取过程中循环,直到获得整个消息
如果您以前没有联网经验,那么实现套接字是一个容易出错的练习。尽管如此,所有这些问题都在开源网络通信库中得到了解决。如果您遵循非常基本的11行示例,沿着调用树一直走下去,您将看到如何正确实现异步套接字。我想这是常见的TCP问题。i、 它是一种流而不是基于消息的协议,因此一个发送呼叫可以分为多个接收呼叫。一些潜在的重复项两个显著的缺点1)我找不到协议规范2)GPL