【问题标题】:Socket.Close() doesn't terminate Socket.Accept()!Socket.Close() 不会终止 Socket.Accept()!
【发布时间】:2016-06-25 16:12:09
【问题描述】:

这是我的代码:

using System;
using System.Net;
using System.Net.Sockets;

public static void main()
{
    Socket _SocketTCP = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    _SocketTCP.Bind(new IPEndPoint(IPAddress.Any, 1234));
    _SocketTCP.Listen(5);

    while (true)
    {
        Socket socket;

        try
        {
            socket = _SocketTCP.Accept();
        }
        catch (ObjectDisposedException)
        {
            break;
        }

        Console.WriteLine("A Client Connected");
    }  
    Console.WriteLine("Server Closed");
}

在另一个线程中,我调用_SocketTCP.Close();。但是,在我调用 _SocketTCP.Close(); 方法后,while 循环永远不会退出并且“服务器已关闭”永远不会打印出来。 我做错了什么??

【问题讨论】:

  • 请创建可执行的重现代码。通常,这是可行的……我认为。

标签: c# multithreading sockets networking


【解决方案1】:

只要你捕捉到ObjectDisposedException,你需要在你的_SocketTCP上实际调用Dispose方法。

【讨论】:

  • Socket.Close() 方法处理 Socket 对象。 Socket.Receive() 方法被终止,它在调用 Socket.Close() 方法时抛出 ObjectDisposedException。但是,这不适用于 Socket.Accept() 方法。
  • @None 是的,你是对的,对不起。你能试着抓住SocketException,而不是ObjectDisposedException吗?它应该给你一个像A blocking operation was cancled by blah-blah-blah这样的消息?如果它不适合你,请提供你在Socket 上调用Close() 的代码,因为你的情况真的很奇怪:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-15
  • 2016-04-16
  • 1970-01-01
  • 1970-01-01
  • 2018-02-02
  • 2017-04-06
相关资源
最近更新 更多