当服务器短暂脱机或完全脱机然后重新启动时,我在处理重新连接时遇到问题。我无法让我的客户自动重新连接。此外,在任何地方都没有可以看到套接字状态的属性(套接字已断开连接?),以便我可以手动重新连接。我错过了什么?
根据 nanomsg 文档,有一个重新连接间隔设置称为NN_RECONNECT_IVL
. 我似乎无法让它工作。考虑以下:
我有一个可用的 nanomsg 服务器:
nanocat --bind-local 1234 --bus --interval 1 --ascii --data "hello world"
然后我附上它:
nanocat --connect-local 1234 -A --bus
我看到了:
hello world
hello world
hello world
然后,我杀死服务器并重新启动它,nanocat 不会自动重新连接。也许我缺少一个设置?
接下来,我使用 NNanomsg 在 C# 中构建了一个客户端:
class Program
{
static void Main(string[] args)
{
NNanomsg.NanomsgSocket s = new NNanomsg.NanomsgSocket(NNanomsg.Domain.SP, NNanomsg.Protocol.BUS);
// doesn't seem to do anything
s.Options.ReconnectInterval = new TimeSpan(0, 0, 5);
var e = s.Connect("tcp://127.0.0.1:1234");
while (true)
{
byte[] ddd;
ddd = s.ReceiveImmediate();
if (ddd != null)
{
string m = UTF8Encoding.UTF8.GetString(ddd);
Console.WriteLine(m);
}
else
{
// don't peg the CPU
Thread.Sleep(100);
}
}
}
}
我看到了:
hello world
hello world
hello world
然后,我杀死服务器并重新启动它,我的 C# 客户端不会自动重新连接。也许我缺少一个设置?
接下来,我在 c 中构建了一个客户端:
#include <nanomsg/nn.h>
#include <nanomsg/bus.h>
int _tmain(int argc, _TCHAR* argv[])
{
int sock;
int recv;
int reconnect_interval;
char *buf;
buf = NULL;
reconnect_interval = 5;
sock = nn_socket (AF_SP, NN_BUS);
nn_setsockopt(sock, NN_SOL_SOCKET , NN_RECONNECT_IVL, &reconnect_interval, sizeof(reconnect_interval));
nn_connect(sock, "tcp://127.0.0.1:1234");
while(1 == 1)
{
recv = nn_recv(sock, &buf, NN_MSG, 0);
if(recv > 0)
{
printf("%s\r\n", buf);
nn_freemsg (buf);
}
}
return 0;
}
我看到了:
hello world²²²²½½½½½½½½■ε■ε■
hello world²²²²½½½½½½½½■ε■ε■
hello world²²²²½½½½½½½½■ε■ε■
(垃圾,因为我猜 nanomsg 没有初始化缓冲区,我懒惰地使用 printf)
然后,我杀死服务器并重新启动它,我的 C 客户端不会自动重新连接。
我错过了什么?
注意:我尝试在 and 之前和之后设置套接字nn_connect()
选项s.Connect
。没有。