如果套接字,应用程序崩溃而不抛出异常.在套接字关闭后调用BeginSend



我正在编写一个套接字应用程序,它可以同时异步轮询多个服务器,并向用户报告其状态的任何变化。到目前为止,一切都在工作,除了一个小错误,我似乎不能弄清楚。

服务器每10秒创建一堆套接字,然后调用异步连接。然后由ProcessConnectionComplete(IAsyncResult)方法处理,该方法随后调用两个Socket。然后是Socket。开始发送。然后用另一种方法处理接收到的任何数据。

然后,在下一波套接字创建之前的10秒结束时,任何尚未接收到数据并关闭的套接字将被一个循环强制关闭。

我遇到的问题是,如果套接字恰好在socket之前关闭。BeginSend方法被调用(即有人被网络电缆绊倒,或者另一端的服务器崩溃),程序无异常退出(错误代码0),当它应该抛出异常时。下面是代码:

private static void ProcessConnectionComplete(IAsyncResult iar)
{
    SocketState state = iar.AsyncState as SocketState;
    if (state.Socket.Connected)
    {
        // start waiting for a reply
        state.Socket.BeginReceive(state.Buffer, 0, state.Buffer.Length, SocketFlags.None, new AsyncCallback(frm_Server_Poll.ProcessAsyncReceive), state);
        //state.Socket.Close(); // if socket is closed after .Connected check and before BeginSend, crash occurs
        try
        {
            // send message
            state.Socket.BeginSend(new byte[] { (byte)'xfe' }, 0, 1, SocketFlags.None, null, state);
        }
        catch (Exception ex) // Never called, EXCEPTION WHERE ARE YOU???
        {
            throw (ex);
        }
    }
    else
    {
        state.ServerInfo.connected = false;
    }
}

为什么会发生这种情况?我有一些想法,这是与线程处理异步调用的方式有关,但不知道如何捕获异常。

在调用Socket.EndReceive时,应该在回调(frm_Server_Poll.ProcessAsyncReceive)中发生异常。

同样,对于send,异常应该发生在调用Socket.EndSend时的回调中。但是,您的BeginSend没有用于处理错误的回调。

我不能确定,但我怀疑这就是异常神秘地消失的原因。

值得注意的是,BeginReceiveBeginSend都可以直接抛出,如果套接字在调用时被处理。

,如果套接字恰好在socket关闭之前关闭。BeginSend方法被称为(即有人绊倒了网络电缆,或服务器上的?另一端崩溃)

我不明白。这两个事件都不会关闭套接字。只有你能关闭你的插座。这些事件可以中止连接,在这种情况下,您的send将获得ECONNRESET在c#中映射到的任何异常。如果你自己关闭套接字然后发送,你将得到EBADF映射到的任何东西,如果c#中没有其他东西先捕获它。

最新更新