Случайное исключение
Я изучал сокеты на С#, и после того, как мне удалось кодировать базовый чат из двух человек, я решил перейти в многопользовательский чат, в котором есть сервер и X-клиенты.
Теперь возникает проблема, возникающая даже при подключении только одного клиента. Как только клиент подключится, сервер и клиент получат сообщение "Другой клиент подключен" или "Подключен к серверу". Во-вторых, оба они щелкнули ОК, клиентская программа выйдет из строя, затем на сервере (я буду иметь дело с отключением позже, я хочу, чтобы он работал первым). И, как вы можете догадаться из названия, единственное, что я получаю, это "исключение из первого шанса", которое даже после того, как я придумал или прочитал здесь, я не мог остановить его, не понимая, ПОЧЕМУ он пришел.
Вот две строки из вывода отладчика:
В mscorlib.dll произошла первая случайная ошибка типа "System.FormatException"
Программа "[6808] Chat - sockets.vshost.exe: Managed (v4.0.30319)" вышла с кодом 0 (0x0).
Try-catch не работает, пытаясь поймать это исключение. И, как я уже говорил, программа вылетает даже в режиме отладки, не обнаруживая ошибки.
И вот код:
Обратный вызов клиента:
private void ClientConnectCallback(IAsyncResult res)
{
serverSocket.EndConnect(res);
MessageBox.Show("Server connected.");
serverSocket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ClientRecieveCallback), null);
}
buffer - это локальная переменная, массив байтов размером 1000. serverSocket - это сокет, на котором мы используем метод BeginConnect.
И это ответ сервера на вызов клиента:
private void ServerAcceptCallback(IAsyncResult res)
{
//Recieving the socket.
Socket tempSocket = localHost.EndAccept(res);
//Creating a new buffer for it.
byte[] tempBuffer = new byte[1000];
//Adding the socket to the array.
Socket[] tempArray = clients;
clients = new Socket[tempArray.Length + 1];
Array.Copy(tempArray, clients, tempArray.Length);
clients[clients.Length - 1] = tempSocket;
//Adding the buffer to the list.
buffers.Add(tempBuffer);
MessageBox.Show("Another client connected");
//Begin receive data.
tempSocket.BeginReceive(tempBuffer, 0, tempBuffer.Length, SocketFlags.None, new AsyncCallback(ServerRecieveCallback), null);
localHost.BeginAccept(new AsyncCallback(ServerAcceptCallback), null);
numOfPpl++;
ServerSend("~~~NumOfPpl:" + numOfPpl);
}
localHost
- это сокет, который мы привязываем к порту, и к ЛЮБОЙ адрес, а затем мы называем его "Listen (0)". tempBuffer
- это новый массив байтов, который мы создаем для использования в качестве буфера только для этого соединения. clients
- это массив сокетов, содержащий клиентов сервера. buffers
- это список буферов клиентов.
numOfPpl - количество людей в текущем разговоре, и, вызывая ServerSend с текстом "~~~ NumOfPpl:", клиенты получают следующий номер как количество людей, а не сообщение, и изменяют его соответственно в их компьютер.
Надеюсь, я ясно дал понять, мой первый вопрос на этом сайте.
На самом деле даже часть информации, которая поможет мне получить себя дальше (потому что мне больше нечего делать сейчас), поможет многое.
Ответы
Ответ 1
Вероятно, вы получили исключение из сокета I/O, который не находится в вашем блоке catch
.
В Visual Studio выберите "Отладка", "Исключения", а затем отметьте все флажки, чтобы сообщить Visual Studio ввести отладчик, как только будет отправлено какое-либо исключение.