我正在创建一个客户端服务器应用程 服务器已经设计好并等待客户端的连接.现在在客户端部分,我希望在应用程序的整个生命周期中保持连接活动,并且只有在主客户端应用程序关闭或关闭或服务器关闭时才会关闭连接.
目前每10秒服务器关闭TCP连接.我尝试过
socket.SetSocketOption(SocketOptionLevel.Tcp, SocketOptionName.KeepAlive, true);
Run Code Online (Sandbox Code Playgroud)
但它对我不起作用..下面是我的代码块
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();
}
Run Code Online (Sandbox Code Playgroud)
在我有的处理程序中:
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) */
}
}
}
Run Code Online (Sandbox Code Playgroud)
小智 7
在调用中SetSocketOption(),KeepAlive在SocketOptionLevel.Tcp级别上无效,而是使用SocketOptionLevel.Socket.
SetSocketOption( SocketOptionLevel.Socket, SocketOptionName.KeepAlive, true );
代码中的注释(“whrn 没有数据包意味着没有 TCP 连接”)位于您从另一端收到断开连接(0 字节)数据包的位置。无法保持该连接处于活动状态,因为另一方选择关闭它。
如果连接由于网络问题而关闭,您要么会收到异常,要么看起来连接有效但安静。
保持活动机制始终与超时一起工作 - 超时强制“如果在 x 秒内没有收到数据,则关闭连接”,其中保持活动只是发送一个虚拟数据包以防止发生超时。
通过自己实现一个协议(您在 TCP/IP 级别上操作),如果您已经在另一端实现了超时,则只需实现保持活动状态。
| 归档时间: |
|
| 查看次数: |
34888 次 |
| 最近记录: |