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

标签 c# sockets asynchronous crash send

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

服务器每 10 秒创建一组套接字,然后调用异步连接。然后由 ProcessConnectionComplete(IAsyncResult iar) 方法处理,该方法随后调用 Socket.BeginReceive 和 Socket.Begin 发送。然后用另一种方法处理任何接收到的数据。

然后,在创建下一波套接字之前的 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)

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

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

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

关于c# - 如果在套接字关闭后调用 Socket.BeginSend,则应用程序崩溃而不会抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7754400/

相关文章:

c# - 平移和缩放图像

c# - 图片 url 的正则表达式

c# - 在 ASP.net 中使用 SQL 填充的 GridView 的日期格式 - 非绑定(bind)字段

python - gsm网卡端口映射与python中的udp套接字

javascript - 如何使用回调嵌套 jQuery .when 调用?

c# - 在aspx中按属性查找元素

java - 连接来自 BufferedReader 的字符串并传递给 UI 线程

java - 关闭客户端套接字时如何防止 "Connection reset"错误?

javascript - javascript 中的异步等待 sqlite

c# - 将 `Task.WhenAll` 与 `INotifyCompletion` 一起使用