第一次机会异常

14

我正在学习C#中的套接字,成功编写了一个基本的两个人聊天程序后,我决定继续开发多人聊天室,其中有一个服务器和X个客户端。

现在,即使只连接了一个客户端,也会出现问题。一旦客户端连接,服务器和客户端都会收到消息“Another client connected”或“Connected to server”。他们点击确定的同时,客户端的程序崩溃,随后是服务器的(我会先处理断开连接问题,但我想先让它工作起来)。正如您从标题中猜到的那样,我得到的唯一信息是“第一次机会异常”,即使在Google或者读这里之后,我仍然无法阻止它的发生,也无法理解它为什么会发生。

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

在 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个回答

18

你可能在套接字I/O回调中得到了一个异常,而这个异常没有被包含在你的catch块中。

在Visual Studio中,点击Debug菜单,选择Exceptions,然后勾选所有复选框,告诉Visual Studio在任何异常抛出时立即进入调试器。


谢谢,但这正是问题所在 - 我点击调试菜单 - 但没有“异常”子菜单...我正在使用VS 2010 Express,并且我已经尝试从多个方向找到此异常选项位置,但目前还没有运气。 - Jong
@SLaks 看起来我必须这样做才能通知。 - Jong
@SLaks 谢谢,我已经阅读了并添加了这个命令行,现在让我们看看它是否会通知我异常情况。 - Jong
1
哦,我的天啊。我真的很生气。异常是由于整数解析失败引起的!哇,谢谢你帮我找到了这个问题! - Jong

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接