Сокеты: операция блокировки была прервана вызовом WSACancelBlockingCall - PullRequest
1 голос
/ 04 октября 2019

У меня есть класс, где я слушаю соединения в отдельном потоке, моя проблема в том, что когда я пытаюсь закрыть сокет, в Socket.Accept(); возникает исключение, которое говорит:

Операция блокировки была прервана вызовом WSACancelBlockingCall

После поиска я понял, что, вероятно, это потому, что я закрываю сокет из другого потока (в моем случае этот поток является UI). Как правильно закрыть и открыть сокет в любое время?

Слушатель

class Listener
{

    private Socket s;
    private bool listening = false;

    public bool Running
    {
        get { return listening; }
    }

    public Listener()
    {
       s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    }

    public void BeginListen(int port)
    {
        s.Bind(new IPEndPoint(IPAddress.Any, port));
        s.Listen(100);
        listening = true;

        while (listening)
        {
            Socket clientSocket = s.Accept();
        }
    }

    public void StopListen()
    {
        if (listening == true)
        {
            s.Close();
            listening = false;
        }

    }

}

frmMain

public partial class frmMain : Form
{

private Listener listener;

private void frmMain_Load(object sender, EventArgs e)
{
   listener = new Listener();
}

private void listen()
{
   listener.BeginListen(101);
}

private void stopToolStripMenuItem_Click(object sender, EventArgs e)
{
   listener.StopListen();
}

private void tmrcheck_Tick(object sender, EventArgs e)
{
    if (listener.Running)
    {
        startToolStripMenuItem.Enabled = false;
        stopToolStripMenuItem.Enabled = true;
    }

    if (!listener.Running)
    {
        startToolStripMenuItem.Enabled = true;
        stopToolStripMenuItem.Enabled = false;
    }
}

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...