我在使用ZeroMQ和IPv6時遇到了麻煩。當我通過IPv4使用連接或者使用「tcp:// [:: 1]:5558」時,它會像魅力一樣連接。但是,如果我使用服務器完整的IPv6地址(在本地主機或遠程主機上)連接,但不在另一端點上獲取數據。ZeroMQ不能在單播IPv6上工作
這裏是我的代碼示例:
client.cpp
#include <stdio.h>
#include <zmq.h>
int main(int argc, char** argv)
{
void* context = zmq_ctx_new();
void* socket = zmq_socket(context, ZMQ_SUB);
int ipv6 = 1;
zmq_setsockopt(socket, ZMQ_IPV6, &ipv6, 4);
zmq_connect(socket, "tcp://[fe80::52e5:49ff:fef8:dbc6]:5558");
//zmq_connect(socket, "tcp://[::1]:5558");
zmq_setsockopt(socket, ZMQ_SUBSCRIBE, "pub", 3);
zmq_msg_t message;
do {
zmq_msg_init (&message);
zmq_msg_recv (&message, socket, 0);
printf("%s\n", (char*)zmq_msg_data(&message));
zmq_msg_close(&message);
} while (zmq_msg_more(&message));
}
而且 server.cpp
#include <string.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <zmq.h>
int main(int argc, char**argv)
{
void* context = zmq_ctx_new();
void* publisher = zmq_socket(context, ZMQ_PUB);
int ipv6 = 1;
zmq_setsockopt(publisher, ZMQ_IPV6, &ipv6, sizeof(int));
zmq_bind(publisher, "tcp://*:5558");
char buffer[4] = "pub";
unsigned tries = 0;
while(tries < 10) {
zmq_send(publisher, &buffer, strlen(buffer), 0);
tries++;
sleep(1);
}
return 0;
}
我使用ZeroMQ 4.0.0 RC,但它也在3.2上發生。我在Linux上(slackware)並從源代碼安裝它。我還測試了使用jeroMQ的java服務器,問題是一樣的。我使用REQ-REP連接做了另一個測試,問題是一樣的。
在此先感謝您的幫助。
在這一點上,你可能需要做一些調試。您可以使用tcpdump來確定數據包是否正在發送(並在另一端接收),另外,您可以查看「ss -tpan」的輸出以查看服務器連接上是否有任何傳入數據包。最後,我建議調查一下「netstat -s -p tcp」,看看是否可以發現使用TCP統計信息的任何錯誤 –