2013-08-28 51 views
3

我正在创建一个客户端服务器应用程序。服务器已经在设计并且在等待来自客户端的连接。现在,在客户端部分中,我希望在应用程序的整个生命周期中保持连接的活动状态,并且只有在主客户端应用程序关闭或关闭或服务器关闭时才会关闭连接。Tcp连接保持活着

目前每10秒服务器关闭TCP connection.I试图与

socket.SetSocketOption(SocketOptionLevel.Tcp, SocketOptionName.KeepAlive, true); 

,但它不为我工作.. 下面是我的代码块

public TCPStreamDevice(string RemoteIPAddress, int RemotePort, string SourceIPAddress, int SourcePortNo)   
{ 
    mIpAddress = RemoteIPAddress; 
    mPort = RemotePort; 

    mClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
    System.Net.IPEndPoint LocalEndPoint = new System.Net.IPEndPoint(System.Net.IPAddress.Parse(SourceIPAddress), SourcePortNo); 

    mClient.Bind(LocalEndPoint); 

    mDataReceivedCallback = new AsyncCallback(DataReceivedTCPCallback_Handler); 
    mBuffer = new byte[1024]; 
    Description = new DeviceDescription(); 
} 

,并在处理程序我有:

private void DataReceivedTCPCallback_Handler(IAsyncResult ar) 
{ 
    try 
    { 
     Socket client = (Socket)ar.AsyncState; 
     int bytesReceived = client.EndReceive(ar); 

     if (bytesReceived > 0) 
     { 
      //to know transport level errors 
      //EngineInterface.reponseReceived(mBuffer, false); 

      ReceiveCallBackFunc(mBuffer, bytesReceived); 

      client.BeginReceive(mBuffer, 0, 1024, SocketFlags.None, DataReceivedTCPCallback_Handler, client); 
     } 
     else 
     { 
      //disconnect 
      /* when there is no datapacket means no TCP connection is alive now (how can i keep Tcp alive here) */ 
     } 
    } 
} 
+1

这可能是服务器关闭连接。当超时超时时,除了在10秒内发送一些数据外,您无法做任何事情。接收到的0字节意味着另一端断开。 –

+0

有什么方法可以通过它来重新启动TCP会话? –

+0

您必须在需要时重新连接。对于重载服务器,这是常见的行为。 –

回答

1

该评论(“有没有datapacket意味着没有TCP连接“)放在您从另一端收到断开连接(0字节)数据包的地方。有没有办法让连接活着,因为对方据法权产将其关闭。

如果连接被关闭,由于网络问题,你要么得到一个异常,否则会看起来好像连接是有效的,但安静。

保持有效机制总是超时工作一起 - 超时强制执行“如果x秒没有收到数据,关闭连接”里的保活只需发送伪数据包,以保持超时的发生。

通过实施自己的协议(你在TCP/IP级别操作),你只需要实现保活,如果你已经有了对对方实施了暂停。

+0

如何实现保持活着的计时器?你能否帮我解决这个问题..我试着用一些教程保持活力..他们不工作 –

2

的意见,回答以上是有效的 - 听起来像一个糟糕的设计选择有打开的应用程序的整个生命周期的插座,并希望事情能正常工作 - 你应该建立某种故障安全机制的情况下,连接得到下降。

返回保留消息:你需要他们在攻防两端 - 服务器和客户端,以便检查插座如何设置在两侧。我认为keep alive的默认值是2个小时 - 这是等待keep-alive数据包的很长时间,但它可以改变。检查Socket.IOControl方法并使用IOControlCode.KeepAliveValues,其结构看起来像这样(非托管)http://msdn.microsoft.com/en-us/library/ms741621.aspx。有关控制代码的更多信息,请参考:http://msdn.microsoft.com/en-us/library/system.net.sockets.iocontrolcode.aspx

6

在调用SetSocketOption()KeepAlive是无效的SocketOptionLevel.Tcp水平,而是使用SocketOptionLevel.Socket

SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.KeepAlive, true);

+0

你也应该为套接字设置'keepalivetime'和'keepaliveinterval'设置。搜索'SetSocketKeepAliveValues'和'SetTcpKeepAlive' –