这是我在这里的第一篇文章,所以请温柔=)
我正在为我的办公室编写一个用于管理数据库的异步服务器/客户端应用程序,我在我的计算机上本地对其进行了测试,它运行良好。当我在另一台机器上上传服务器工具时,我发现了一些让我发疯的东西:服务器/客户端只处理第一个查询,当我发送另一个查询时,服务器和客户端都崩溃了。
在调试模式下通过行后,我发现了问题:在 beginconnect() 之后(在第二次查询期间),套接字已连接,但当调试器到达 beginend() 行时,套接字断开(这只发生在客户端,服务器端的套接字似乎已连接)。
我不知道它是怎么发生的,每次发送新查询时都会重新实例化套接字,当然在查询过程(发送/接收)完成后会关闭和处理。我的想法是套接字的处理不会立即发生,而是在一段时间后发生(但为什么总是在新的 beginconnect() 和 beginend() 之间?)。你对此有任何线索吗?或者我应该在精神病院预订一个房间?
*新部分(编辑)*
好吧..又来了!这次客户端的套接字在整个会话中保持打开状态(套接字关闭仅在客户端工具关闭时发生)但我收到另一种错误:“System.Net.Sockets.SocketException(0x80004005):现有连接被强行关闭System.Net.Sockets.Socket.EndReceive(IAsyncResult asyncResult) 的远程主机”经过一番谷歌搜索后,我发现这种错误通常是由连接另一端的服务器触发的,所以我尝试“挖掘”服务器代码行来确定此连接关闭命令的位置。我发现问题可能出在以下代码中:
private static void SendCallback(IAsyncResult ar)
{
Console.WriteLine("send callback");
try
{
// Retrieve the socket from the state object.
Socket handler = (Socket)ar.AsyncState;
// Complete sending the data to the remote device.
int bytesSent = handler.EndSend(ar);
Console.WriteLine("\nQuery answer sent to client");
handler.Shutdown(SocketShutdown.Both);
//handler.Disconnect(true);
//handler.Dispose();
state.content = new List<byte[]>();
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
Console.ReadKey();
}
}
删除 handler.shutdown 行,客户端不再能够检测到传输结束(不是真正的问题,是发送数据包的最后一部分,因此可以将其用作触发器......至少我认为)。有什么建议吗?我读了一些关于keepalive的东西,但我不明白如何设置它,以及在这种情况下是否真的有必要。提前感谢您的所有努力。