c#异步服务器/客户端。套接字(在客户端)断开“随机”

时间:2013-01-31 16:36:00

标签: c# sockets asynchronous

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

我正在为我的办公室编写一个用于管理数据库的异步服务器/客户端应用程序,我在我的计算机上本地测试它并且工作正常。当我在另一台机器上上传服务器工具时,我发现一些让我发疯的事情:服务器/客户端只处理第一个查询,当我发送另一个查询服务器和客户端崩溃时。

在调试模式下执行行后我发现问题:在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的内容,但我无法理解如何设置它以及在这种情况下是否真的有必要。提前感谢您的所有努力。

1 个答案:

答案 0 :(得分:0)

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