1

这是我在这里的第一篇文章,所以请温柔=)

我正在为我的办公室编写一个用于管理数据库的异步服务器/客户端应用程序,我在我的计算机上本地对其进行了测试,它运行良好。当我在另一台机器上上传服务器工具时,我发现了一些让我发疯的东西:服务器/客户端只处理第一个查询,当我发送另一个查询时,服务器和客户端都崩溃了。

在调试模式下通过行后,我发现了问题:在 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的东西,但我不明白如何设置它,以及在这种情况下是否真的有必要。提前感谢您的所有努力。

4

1 回答 1

0

我建议不要像你一样打开和关闭套接字。
如果可能,请保持套接字打开,因为它需要由您的程序和操作系统释放。

于 2013-01-31T16:39:19.610 回答