Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#-主机错误中的软件中止了已建立的连接_C#_Sockets_Tcpclient_Tcplistener - Fatal编程技术网

C#-主机错误中的软件中止了已建立的连接

C#-主机错误中的软件中止了已建立的连接,c#,sockets,tcpclient,tcplistener,C#,Sockets,Tcpclient,Tcplistener,我正在使用TCPListener构建一个模拟服务器 当我试图通过运行客户端调试代码时,我能够在服务器上读取请求。但是在客户端,抛出了一个异常。以下是我从跟踪中得到的异常: System.ServiceModel.CommunicationException:套接字连接已中止。这可能是由于处理消息时出错、远程主机超过接收超时或基础网络资源问题造成的。本地套接字超时为“00:05:00”。--System.IO.IOException:无法从传输连接读取数据:已建立的连接被主机中的软件中止。--Sy

我正在使用TCPListener构建一个模拟服务器

当我试图通过运行客户端调试代码时,我能够在服务器上读取请求。但是在客户端,抛出了一个异常。以下是我从跟踪中得到的异常:

System.ServiceModel.CommunicationException:套接字连接已中止。这可能是由于处理消息时出错、远程主机超过接收超时或基础网络资源问题造成的。本地套接字超时为“00:05:00”。--System.IO.IOException:无法从传输连接读取数据:已建立的连接被主机中的软件中止。--System.Net.Sockets.SocketException:主机中的软件中止了已建立的连接

以下是我在服务器上实现的代码:

TcpClient client = listener.AcceptTcpClient();
NetworkStream nwStream = client.GetStream();
byte[] buffer = new byte[client.ReceiveBufferSize];
int bytesRead = nwStream.Read(buffer, 0, client.ReceiveBufferSize);
var dataReceived = Encoding.ASCII.GetString(buffer, 0, bytesRead);

byte[] sendBytes = null;
try
{
    var output = "POST HTTP/1.1 200 OK\r\n";
    output += "Server: Apache-Coyote/1.1\r\n";
    output += "Content-Type: application/soap+xml\r\n";
    output += "Content-Length: 632\r\n";
    output += "Date: Thu, 06 Aug 2015 02:06:39 GMT\r\n\r\n";
    output +=
        "<S:Envelope xmlns:S=\"http://www.w3.org/2003/05/soap-envelope\"><S:Header></S:Header><S:Body></S:Body></S:Envelope>";
    sendBytes = Encoding.ASCII.GetBytes(output);
    nwStream.Write(sendBytes, 0, sendBytes.Length);
    nwStream.Flush();
}
catch (SocketException se)
{
    throw;
}

client.Close();
TcpClient client=listener.AcceptTcpClient();
NetworkStream nwStream=client.GetStream();
byte[]buffer=新字节[client.ReceiveBufferSize];
int bytesRead=nwStream.Read(buffer,0,client.ReceiveBufferSize);
var dataReceived=Encoding.ASCII.GetString(缓冲区,0,字节读取);
字节[]sendBytes=null;
尝试
{
var output=“POST HTTP/1.1 200正常\r\n”;
输出+=“服务器:Apache Coyote/1.1\r\n”;
输出+=“内容类型:应用程序/soap+xml\r\n”;
输出+=“内容长度:632\r\n”;
输出+=“日期:2015年8月6日星期四02:06:39 GMT\r\n\r\n”;
输出+=
"";
sendBytes=Encoding.ASCII.GetBytes(输出);
nwStream.Write(sendBytes,0,sendBytes.Length);
nwStream.Flush();
}
捕获(SocketException se)
{
投掷;
}
client.Close();
编辑


我还试图禁用防火墙,但仍然出现异常。

设置正确的内容长度修复了此问题


如果内容长度大于实际长度,客户端将继续等待响应的其余部分。但由于服务器已完成发送响应,因此将结束该过程。

在客户端有机会读取数据之前,您正在关闭连接。永远不要关闭服务器上的连接。客户端应始终打开连接并关闭连接。要关闭服务器上的应用程序,请捕获客户端关闭连接时发生的关闭事件。