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

问题描述:

这是我的第一篇文章在这里,所以请温柔=)c#异步服务器/客户端。插座(在客户端)断开“随机”

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

经过调试模式下的线路后,我发现问题:在beginconnect()(在第二个查询期间)之后套接字已连接,但是当调试器到达beginsend()行时,套接字断开连接客户端,服务器端的套接字似乎连接)。

我不知道它是如何发生的,每当我发送一个新的查询时,套接字就会重新实例化,当然在查询过程(发送/接收)完成后关闭并处理它。我的想法是,处理套接字不会立即发生,但过了一段时间(但为什么总是在新的beginconnect()和beginsend()之间?)。你有什么线索吗?或者我应该在精神病院预留一个房间?

*新的零件(编者)*

well..here了!这次客户端的套接字对整个会话保持打开状态(套接字关闭仅在客户端工具关闭时发生),但我收到另一种错误:“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

您是否考虑过使用networkcomms.net等网络库?这可能为您节省网络方面的相当一段时间。这里有一个很好的例子:http://www.networkcomms.net/creating-a-wpf-chat-c​​lient-server-application/ – MarcF

+0

感谢这个建议,但我已经写了我的com协议的个人库我希望能够解决这个问题,并理解事情的工作方式。 – foxfox

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

+0

我尝试了这种方法,并且我对它有一个小问题。如果我尝试在发送/接收之后断开套接字(不处理它,只是断开它)操作,我会在同一点收到套接字断开连接的错误消息。这可能是一个与socket..ssuggestion管理不当有关的错误? – foxfox

+0

整个问题更多的是套接字在Windows /操作系统层可能会延迟断开连接,因此不建议断开/处理。如果你实现这个,那么处理时间会变得很复杂,直到断开连接的套接字再次可用。 – weismat

+0

所以我应该直接将它打开并连接?问题是,我不知道用户可以查看查询结果多长时间(几分钟或几小时..),因此套接字可以长时间保持连接状态。这种情况会影响服务器操作吗? (它应该接受多达10个连接)。也许我不明白套接字是如何工作的...... – foxfox