当服务器短暂脱机或完全脱机,然后重新启动时,我在处理重新连接时遇到了问题。我无法让我的客户端自动重新连接。另外,没有任何属性可以让我看到套接字的状态(套接字是否断开连接?)这样我就可以手动重新连接。我遗漏了什么?
对于According to the nanomsg documentation,有一个名为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客户机不会自动重新连接。
我遗漏了什么?
注意:我尝试在nn_connect()和s.Connect之前以及之后设置套接字选项。不是的。
发布于 2014-11-19 06:01:17
我做的测试没有使用nanocat。作为基础,我以this tutorial中的总线为例
这是节点的C++代码:
#include <assert.h>
#include <libc.h>
#include <stdio.h>
#include "nanomsg-master/src/nn.h"
#include "nanomsg-master/src/bus.h"
int node (const int argc, const char **argv)
{
int sock = nn_socket (AF_SP, NN_BUS);
assert (sock >= 0);
assert (nn_bind (sock, argv[2]) >= 0);
sleep (1); // wait for connections
if (argc >= 3)
{
int x=3;
for(x; x<argc; x++)
assert (nn_connect (sock, argv[x]) >= 0);
}
sleep (1); // wait for connections
int to = 1000;
assert (nn_setsockopt (sock, NN_SOL_SOCKET, NN_RCVTIMEO, &to, sizeof (to)) >= 0);
// SEND
int sz_n = strlen(argv[1]) + 1; // '\0' too
printf ("%s: SENDING '%s' ONTO BUS\n", argv[1], argv[1]);
int send = nn_send (sock, argv[1], sz_n, 0);
assert (send == sz_n);
while (1)
{
// RECV
char *buf = NULL;
int recv = nn_recv (sock, &buf, NN_MSG, 0);
if (recv >= 0)
{
printf ("%s: RECEIVED '%s' FROM BUS\n", argv[1], buf);
nn_freemsg (buf);
}
}
return nn_shutdown (sock, 0);
}
int main (const int argc, const char **argv)
{
if (argc >= 3) node (argc, argv);
else
{
fprintf (stderr, "Usage: bus <NODE_NAME> <URL> <URL> ...\n");
return 1;
}
}我为测试修改了运行脚本:
gcc testbus.c nanomsg-master/.libs/libnanomsg.a -o testbus
./testbus node0 tcp://127.0.0.1:1234 & node0=$!
./testbus node1 tcp://127.0.0.1:1235 tcp://127.0.0.1:1234 & node1=$!
./testbus node2 tcp://127.0.0.1:1236 tcp://127.0.0.1:1234 & node2=$!
./testbus node3 tcp://127.0.0.1:1237 tcp://127.0.0.1:1234 & node3=$!
sleep 2
ps -ax | grep testbus | grep -v grep
echo "-"
kill $node0
echo "After killing server"
ps -ax | grep testbus | grep -v grep
echo "-"
echo "Running new server..."
./testbus node0 tcp://127.0.0.1:1234 & node0=$!
sleep 5
ps -ax | grep testbus | grep -v grep
echo "-"
kill $node0 $node1 $node2 $node3
ps -ax | grep testbus | grep -v grep
echo "-"在这里,我将node0设置为没有传出连接的服务器点。其他节点只有一个到一个服务器节点的传出连接。2秒后我杀了node0。看看我得到的结果日志:

正如您所看到的,在node0重启后,正如预期的那样,可以进行通信。即使不设置重新连接间隔也是如此。我希望这个例子能有所帮助。
https://stackoverflow.com/questions/26959718
复制相似问题