Я пытаюсь создать простое приложение для чата в c #, и я хочу, чтобы программа сервера могла начинать и прекращать прослушивание клиентов, пытающихся подключиться. Я использую BeginRecieveFrom для начала прослушивания, но я хочу иметь возможность остановить прослушивание при нажатии на кнопку. Я предполагаю, что я должен использовать EndRecieveFrom для этого, но после тщательного поиска в Google я все еще не уверен, как работает параметр IAsyncResult. Мне не нужно возвращаемое значение, я просто хочу, чтобы сервер прекратил слушать.
Я попытался установить значение IAsyncResult на ноль, но это не сработало.
namespace ChatServer
{
public partial class Server : Form
{
#region Private Members
// Structure to store the client information
private struct Client
{
public EndPoint endPoint;
public string name;
}
// Listing of clients
private ArrayList clientList;
// Server socket
private Socket serverSocket;
// Data stream
private byte[] dataStream = new byte[1024];
// Status delegate
private delegate void UpdateStatusDelegate(string status);
private UpdateStatusDelegate updateStatusDelegate = null;
#endregion
#region Constructor
public Server()
{
InitializeComponent();
}
#endregion
#region Events
private void Server_Load(object sender, EventArgs e)
{
try
{
// Initialise the ArrayList of connected clients
this.clientList = new ArrayList();
// Initialise the delegate which updates the status
this.updateStatusDelegate = new UpdateStatusDelegate(this.UpdateStatus);
// Initialise the socket
serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
// Initialise the IPEndPoint for the server and listen on port 30000
IPEndPoint server = new IPEndPoint(IPAddress.Any, 30000);
// Associate the socket with this IP address and port
serverSocket.Bind(server);
}
catch (Exception ex)
{
lblStatus.Text = "Error";
MessageBox.Show("Load Error: " + ex.Message, "UDP Server", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void btnStart_Click(object sender, EventArgs e)
{
IPEndPoint clients = new IPEndPoint(IPAddress.Any, 0);
EndPoint epSender = (EndPoint)clients;
serverSocket.BeginReceiveFrom(this.dataStream, 0, this.dataStream.Length, SocketFlags.None, ref epSender, new AsyncCallback(ReceiveData), epSender);
lblStatus.Text = "Listening";
btnStart.Click -= new EventHandler(btnStart_Click);
btnStart.Text = "Stop Listening";
btnStart.Click += new EventHandler(btnStart_Click2);
}
private void btnStart_Click2(object sender, EventArgs e)
{
IPEndPoint clients = new IPEndPoint(IPAddress.Any, 0);
EndPoint epSender = (EndPoint)clients;
serverSocket.EndReceiveFrom(true, ref epSender);
lblStatus.Text = "Not Listening";
btnStart.Click -= new EventHandler(btnStart_Click2);
btnStart.Text = "Start Listening";
btnStart.Click += new EventHandler(btnStart_Click);
}
}
}