У меня есть класс, где я слушаю соединения в отдельном потоке, моя проблема в том, что когда я пытаюсь закрыть сокет, в 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;
}
}
}