Я изучал сокеты на С#, и после того, как мне удалось кодировать базовый чат из двух человек, я решил перейти в многопользовательский чат, в котором есть сервер и 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:", клиенты получают следующий номер как количество людей, а не сообщение, и изменяют его соответственно в их компьютер.
Надеюсь, я ясно дал понять, мой первый вопрос на этом сайте.
На самом деле даже часть информации, которая поможет мне получить себя дальше (потому что мне больше нечего делать сейчас), поможет многое.