【问题标题】:How to determine the connection state of a client socket?如何确定客户端套接字的连接状态?
【发布时间】:2016-09-20 15:36:25
【问题描述】:

我正在使用 NetMQ 套接字来执行客户端-服务器通信。我有一个监听端口 5555 的服务器和一个 .bind()-s 的客户端。

这是我的代码示例:

using (NetMQContext ctx = NetMQContext.Create())
{
     using (var client = ctx.CreateRequestSocket())
     {                            
           client.Connect("tcp://127.0.0.1:5555");                            
           client.SendFrame(jData);                            
     }
}

如果客户端没有找到任何正在侦听该端口的服务器,我想做的是与用户进行通信。

实际发生的情况是,如果没有服务器侦听该端口,则不会引发异常并调用 .sendFrame() 并且应用程序崩溃。

是否有任何方法(例如异常或状态代码)可以通知我连接是否成功?

【问题讨论】:

  • 您能否请求连接的属性以强制连接创建或失败。例如,您是否可以从本地客户端请求 TCP/IP 连接 ID,这可能会强制连接打开
  • 如果无法连接,我试图找到一些属性或通信方式。据我了解,zeromq/netmq 框架没有通知这一点。无论是客户端还是服务器先连接,库都会尽可能尝试连接

标签: .net zeromq netmq


【解决方案1】:

最好的方法是响应超时。 所以发送一个请求(超时),然后等待超时响应。如果服务器在超时时间内没有响应,你可以去尝试连接下一个服务器。像这样:

if (client.TrySendFrame(TimeSpan.FromSeconds(2), jData) && 
    client.TryReceiveFrame(TimeSpan.FromSeconds(2), out jData) ) 
{
    // Server is online
}
else 
{
    // Server is down
}

【讨论】:

  • 很好用!但是,当我在超时内检查响应时,如果未发送响应,则应用程序崩溃。如果检查为假,则执行跳到 else 语句,该语句应该向调用者返回假消息或任何其他消息。似乎线程卡住了,没有返回给调用者
  • 我不确定我是否理解,在 if 语句中,您已经在 jData 中获得了响应。你得到什么例外?
  • 如果服务器关闭,我想停止并退出该功能,所以继续我的代码。但在这种情况下(服务器关闭),如果我用 else{ return false;} 返回调用者,应用程序就会卡住。在一般调试中,我注意到当离开 using 语句而没有收到服务器的响应时,应用程序卡住了。我不是英语,所以希望很清楚
  • 啊,将套接字的延迟设置为零。 socket.Options.Linger = TimeSpan.Zero;
  • 如果服务器是3d方并且不允许发送怎么办?我可以“连接”到任何随机 IP,我的 c# 客户端不会知道我是否真的连接了..这不能用于关键业务应用程序.. 可以吗?
猜你喜欢
  • 2016-11-09
  • 2015-02-08
  • 2018-08-01
  • 1970-01-01
  • 2019-11-19
  • 2021-12-22
  • 1970-01-01
  • 2011-04-21
  • 2015-05-28
相关资源
最近更新 更多