第一次机会的例外

本文关键字:机会 第一次 | 更新日期: 2023-09-27 17:59:04

我在C#中研究套接字,在编写了一个基本的两人聊天后,我决定转向多人聊天,它有一个服务器和X个客户端。

现在,即使只有一个客户端连接,也会出现问题。客户端连接后,服务器和客户端都会收到一条消息,"Another client connected"或"connected to server"。他们都点击OK的那一刻,客户端的程序崩溃了,然后是服务器程序(我稍后会处理断开连接的问题,我想先让它正常工作)。正如你从标题中猜到的那样,我得到的唯一一件事是"第一次机会例外",即使在谷歌上或阅读了这里,我也无法阻止它的出现,也无法理解它为什么会出现。

以下是调试器输出的两行:

mscorlib.dll 中首次出现"System.FormatException"类型的异常

程序"[6680]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是一个套接字,我们将其绑定到端口和ANY地址,然后将其调用为"Listen(0)"。tempBuffer是一个新的字节数组,我们创建它只是为了用作此连接的缓冲区。clients是一个套接字数组,包含服务器的客户端。buffers是客户端的缓冲区列表。

numOfPpl是当前对话中的人数,通过调用ServerSend并输入文本"~~~numOfPpl:",客户端将接收下一个人数,而不是消息,并在计算机中分别更改。

我希望我把自己说清楚了,这是我在这个网站上的第一个问题。

事实上,即使是一条能帮助我走得更远的信息(因为我现在没有什么可尝试的了)也会有很大帮助。

第一次机会的例外

您可能在套接字I/O回调中遇到异常,该回调不在catch块中。

在Visual Studio中,单击"调试"、"异常",然后选中所有复选框,告诉Visual Studio在引发任何异常时立即进入调试器。