gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 14:11:25 27 4
gpt4 key购买 nike

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

服务器每 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com