Please use this template for reporting suspected bugs or requests for help.
Issue description
When using PAIR-PAIR patten with ipc,client happened coredump, restarted client can connect and send messages to server, but the server can not receive any message.
Environment
libzmq version (commit hash if unreleased): libzmq.so.5.0
ctxt = new ZContext();
server = ctxt.createSocket(ZMQ.PULL);
serverMonitor = ctxt.createSocket(ZMQ.PAIR);
System.out.printf("[%s][%d] monitor addr: %s\r\n", name, System.currentTimeMillis(), monitorAddr);
boolean result = server.monitor(monitorAddr, ZMQ.EVENT_ALL);
System.out.printf("[%s]monitor all events result: %s\r\n", name, result);
serverMonitor.connect(monitorAddr);
// start thread to recv monitor event
new Thread(() -> {
while (true) {
ZMQ.Event event = ZMQ.Event.recv(serverMonitor);
System.out.printf("[%s][%d] monitor event: %s, addr: %s\r\n", name, System.currentTimeMillis(),
ZMQMain1.EventName(event.getEvent()), event.getAddress());
}
}).start();
System.out.printf("[%s][%d]server bind!\r\n", name, System.currentTimeMillis());
server.bind(addr);
// start thread to recv msg
new Thread(() -> {
int i = 0;
while (true) {
try {
String data = new String(server.recv());
System.out.printf("[%s][%d]recv data: %s for times: %d\r\n", name, System.currentTimeMillis(), data, i++);
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
2. client connect to server
client = ctxt.createSocket(ZMQ.PUSH);
clientMonitor = ctxt.createSocket(ZMQ.PAIR);
boolean result = client.monitor(monitorAddr, ZMQ.EVENT_ALL);
System.out.printf("[%s]moclosenitor all events result: %s\r\n", name, result);
// start thread to recv monitor event
new Thread(() -> {
while (true) {
ZMQ.Event event = ZMQ.Event.recv(clientMonitor);
System.out.printf("[%s][%d] monitor event: %s, addr: %s\r\n", name, System.currentTimeMillis(),
MQMain1.EventName(event.getEvent()), event.getAddress());
}
}).start();
System.out.printf("[%s][%d]monitor be ready!\r\n", name, System.currentTimeMillis());
clientMonitor.connect(monitorAddr);
System.out.printf("[%s][%d]connect to server!\r\n", name, System.currentTimeMillis());
client.connect(addr);
// start thread to send msg
new Thread(() -> {
while (counter-- > 0) {
try {
boolean result = client.send("hello world from " + name);
System.out.printf("[%s][%d]send msg for times: %d, res: %s!\r\n", name, System.currentTimeMillis(), i++, result);
Thread.sleep(1000);
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
3. client coredump then restart, and send msg
To mock client(c++) coredump, we start two client thread.
4. server can not receive any msgs
server can receive msg from first client. server cannot receive msg from second cleint, event first client stopped(like coredump).
# What's the actual result? (include assertion message & call stack if applicable)
client happens coredump, restart client can connect and send messges to server, but server cannot recieve messages from restart client.
# What's the expected result?
server could receive messages from restart client.
Please use this template for reporting suspected bugs or requests for help.
Issue description
When using PAIR-PAIR patten with ipc,client happened coredump, restarted client can connect and send messages to server, but the server can not receive any message.
Environment
Minimal test code / Steps to reproduce the issue
// start thread to recv monitor event new Thread(() -> { while (true) { ZMQ.Event event = ZMQ.Event.recv(serverMonitor); System.out.printf("[%s][%d] monitor event: %s, addr: %s\r\n", name, System.currentTimeMillis(), ZMQMain1.EventName(event.getEvent()), event.getAddress()); } }).start();
System.out.printf("[%s][%d]server bind!\r\n", name, System.currentTimeMillis()); server.bind(addr); // start thread to recv msg new Thread(() -> { int i = 0; while (true) { try { String data = new String(server.recv()); System.out.printf("[%s][%d]recv data: %s for times: %d\r\n", name, System.currentTimeMillis(), data, i++); } catch (Exception e) { e.printStackTrace(); } } }).start();
client = ctxt.createSocket(ZMQ.PUSH); clientMonitor = ctxt.createSocket(ZMQ.PAIR); boolean result = client.monitor(monitorAddr, ZMQ.EVENT_ALL); System.out.printf("[%s]moclosenitor all events result: %s\r\n", name, result); // start thread to recv monitor event new Thread(() -> { while (true) { ZMQ.Event event = ZMQ.Event.recv(clientMonitor); System.out.printf("[%s][%d] monitor event: %s, addr: %s\r\n", name, System.currentTimeMillis(), MQMain1.EventName(event.getEvent()), event.getAddress()); } }).start(); System.out.printf("[%s][%d]monitor be ready!\r\n", name, System.currentTimeMillis()); clientMonitor.connect(monitorAddr); System.out.printf("[%s][%d]connect to server!\r\n", name, System.currentTimeMillis()); client.connect(addr); // start thread to send msg new Thread(() -> { while (counter-- > 0) { try { boolean result = client.send("hello world from " + name); System.out.printf("[%s][%d]send msg for times: %d, res: %s!\r\n", name, System.currentTimeMillis(), i++, result); Thread.sleep(1000); } catch (Exception e) { e.printStackTrace(); } } }).start();