第一次机会例外

Jon*_*ong 14 c# sockets

我正在研究C#中的套接字,在我编写了一个基本的双人聊天编码之后,我决定继续进行多人聊天,它有一个服务器和X客户端.

现在,即使只连接了一个客户端,也会出现问题.一旦客户端连接,服务器和客户端都会收到消息"另一个客户端连接"或"连接到服务器".第二个他们都点击OK,客户端程序崩溃,服务器一个跟随(我稍后会处理断开连接,我想先让它工作).正如你可以从标题中猜到的那样,我唯一得到的是"第一次机会异常",即使在谷歌搜索或阅读之后,我也无法阻止它的到来,也无法理解为什么会这样.

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

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);
}
Run Code Online (Sandbox Code Playgroud)

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);
}
Run Code Online (Sandbox Code Playgroud)

localHost是一个套接字,我们绑定到端口,并绑定到任何地址,然后我们称之为'Listen(0)'.tempBuffer是一个新的字节数组,我们创建它只用作此连接的缓冲区.clients是一个套接字数组,包含服务器的客户端.buffers是客户端缓冲区的列表.

numOfPpl是当前对话中的人数,通过使用文本"~~~ NumOfPpl:"调用ServerSend,客户端接收下一个数字作为人数而不是消息,并分别在其计算机中更改它.

我希望自己清楚,这是我在本网站的第一个问题.

实际上,即使是一条可以帮助我进一步发展自己的信息(因为我现在没有任何东西可以尝试)也会有很多帮助.

SLa*_*aks 18

你可能在套接字I/O回调中有一个异常,它不在你的catch块中.

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