C# 从客户端取消服务器套接字

C# 从客户端取消服务器套接字,c#,.net,sockets,C#,.net,Sockets,在.NET异步套接字上有一个大的慢速提要。数据来自仪器,因此每秒可以有1行(或更多)。有时候,它可能会停下来 使用MSDN中的两个示例 我有一个要求,来自socket客户端停止从服务器的传输。每条信息都很小。不需要中途停止消息。需要能够停止循环-可以接收1000秒的小消息(到客户端) 我的想法是保存对客户端的引用并调用: client.Shutdown(SocketShutdown.Both); client.Close(); 这是正确的方法吗 private static Socket

在.NET异步套接字上有一个大的慢速提要。数据来自仪器,因此每秒可以有1行(或更多)。有时候,它可能会停下来

使用MSDN中的两个示例

我有一个要求,来自socket客户端停止从服务器的传输。每条信息都很小。不需要中途停止消息。需要能够停止循环-可以接收1000秒的小消息(到客户端)

我的想法是保存对
客户端的引用
并调用:

client.Shutdown(SocketShutdown.Both);
client.Close();
这是正确的方法吗

private static Socket client;
private static void StartClient()
{
    // Connect to a remote device.  
    try
    {
        // Establish the remote endpoint for the socket.  
        // The name of the   
        // remote device is "host.contoso.com".  
        //IPHostEntry ipHostInfo = Dns.GetHostEntry("host.contoso.com"); Dns.GetHostName()
        IPHostEntry ipHostInfo = Dns.GetHostEntry(Dns.GetHostName());
        IPAddress ipAddress = ipHostInfo.AddressList[0];
        IPEndPoint remoteEP = new IPEndPoint(ipAddress, port);

        // Create a TCP/IP socket.  
        Socket client = new Socket(ipAddress.AddressFamily,
            SocketType.Stream, ProtocolType.Tcp);
        //client = new Socket(ipAddress.AddressFamily,
        //    SocketType.Stream, ProtocolType.Tcp);

        // Connect to the remote endpoint.  
        client.BeginConnect(remoteEP,
                            new AsyncCallback(ConnectCallback), client);
        connectDone.WaitOne();

        // Send test data to the remote device.  
        Send(client, "This is a test<EOF>");
        sendDone.WaitOne();

        // Receive the response from the remote device.  
        Receive(client);
        receiveDone.WaitOne();

        // Write the response to the console.  
        Console.WriteLine("Response received : {0}", response);

        // Release the socket.  
        client.Shutdown(SocketShutdown.Both);
        client.Close();

    }
    catch (Exception e)
    {
        Console.WriteLine(e.ToString());
    }
} 
私有静态套接字客户端;
私有静态void StartClient()
{
//连接到远程设备。
尝试
{
//为套接字建立远程端点。
//名称
//远程设备是“host.contoso.com”。
//IPHostEntry ipHostInfo=Dns.GetHostEntry(“host.contoso.com”);Dns.GetHostName()
IPHostEntry ipHostInfo=Dns.GetHostEntry(Dns.GetHostName());
IPAddress IPAddress=ipHostInfo.AddressList[0];
IPEndPoint remoteEP=新IPEndPoint(ipAddress,端口);
//创建TCP/IP套接字。
套接字客户端=新套接字(ipAddress.AddressFamily,
流,ProtocolType.Tcp);
//客户端=新套接字(ipAddress.AddressFamily,
//流,ProtocolType.Tcp);
//连接到远程端点。
client.BeginConnect(remoteEP,
新的异步回调(ConnectCallback),客户端);
connectDone.WaitOne();
//将测试数据发送到远程设备。
发送(客户端,“这是一个测试”);
sendDone.WaitOne();
//从远程设备接收响应。
接收(客户);
receiveDone.WaitOne();
//将响应写入控制台。
WriteLine(“收到的响应:{0}”,响应);
//松开插座。
client.Shutdown(SocketShutdown.Both);
client.Close();
}
捕获(例外e)
{
Console.WriteLine(如ToString());
}
} 

向服务器发送命令以停止处理会更干净。然后让服务器发送一个响应,指示它已完成该命令。n关闭来自客户端的连接。@jdweng我不懂。我确实收到了服务器的响应。我还可以得到1000个。我想告诉服务器停止发送。您是否控制服务器的实现?如果是这样,您将实现一个命令,该命令将导致服务器(可选)发送确认消息,然后在客户端关闭套接字(看起来像文件结束事件),然后关闭客户端套接字。如果您不控制服务器,并且没有这样的命令,那么您唯一的选择就是从客户端关闭套接字。这种方法的缺点是,服务器无法判断客户机是否“正常”关闭,或者是否存在某种网络错误,因此日志记录变得很棘手。不,您错过了它。该命令将是从客户端发送到服务器的消息。可以说是“再见”。服务器将通过关闭套接字进行响应。