这是我在这里的第一篇文章,所以请温柔=)
我正在为我的办公室编写一个用于管理数据库的异步服务器/客户端应用程序,我在我的计算机上本地测试它并且工作正常。当我在另一台机器上上传服务器工具时,我发现一些让我发疯的事情:服务器/客户端只处理第一个查询,当我发送另一个查询服务器和客户端崩溃时。
在调试模式下执行行后我发现问题:在beginconnect()之后(在第二次查询期间)套接字已连接但是当调试器到达beginsend()行时,套接字被断开(这只发生在客户端上)一边,服务器端的套接字似乎连接了。)
我无法弄清楚它是如何发生的,每次发送新查询时套接字都会重新实例化,当然在查询过程(发送/接收)完成后关闭并处理掉。我的想法是套接字的处理不会立即发生,但一段时间后(但为什么总是在新的beginconnect()和beginsend()之间?)。你有什么线索吗?或者我应该在精神病院预留房间?
*新篇章(已编辑)*
好吧......再来一次!这次客户端的套接字在整个会话期间保持打开状态(仅在客户端工具关闭时发生套接字关闭)但我收到另一种错误:“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的内容,但我无法理解如何设置它以及在这种情况下是否真的有必要。提前感谢您的所有努力。
答案 0 :(得分:0)
我建议不要像你那样打开和关闭套接字。
如果可能,请保持套接字打开,因为它需要被你的程序和操作系统释放。