0

我正在测试 0MQ 库,但我的问题可能是 IPC 通用问题(或不是)。测试非常基础,服务器绑定到套接字,客户端连接到它并发送请求。服务器回复。当客户端收到响应时,它就结束了。

如果我在后台的控制台中启动服务器,然后在同一个控制台中启动客户端,它就可以工作。如果我在不同的控制台(同一个用户)中启动客户端,它会失败,或者服务器没有收到请求,或者客户端没有收到响应,我不知道。

如果我使用命名管道 (ipc) 或套接字,这同样适用。

如果我测试 C 代码或 Python 代码,这同样适用。

我检查了防火墙,但这可能只是套接字试用的问题:

# iptables -L -n
Chain INPUT (policy DROP)
target     prot opt source               destination         
ACCEPT     udp  --  127.0.0.0/24         0.0.0.0/0            udp dpts:80:65535
ACCEPT     tcp  --  127.0.0.0/24         0.0.0.0/0            tcp dpts:80:65535
ACCEPT     udp  --  127.0.0.0/24         0.0.0.0/0            udp dpt:80
ACCEPT     tcp  --  127.0.0.0/24         0.0.0.0/0            tcp dpt:80
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
REJECT     tcp  --  0.0.0.0/0            0.0.0.0/0            reject-with tcp-reset
REJECT     udp  --  0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           
ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0            icmptype 0
ACCEPT     udp  --  192.168.0.0/24       0.0.0.0/0            udp dpt:631
ACCEPT     tcp  --  192.168.0.0/24       0.0.0.0/0            tcp dpt:631

Chain FORWARD (policy DROP)
target     prot opt source               destination         
ACCEPT     all  --  192.168.99.0/24     !192.168.0.0/24      
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination      

内核对于 ipc 看起来没问题:

# grep -i ipc /usr/src/linux/.config
CONFIG_SYSVIPC=y
CONFIG_SYSVIPC_SYSCTL=y
CONFIG_IPC_NS=y
CONFIG_SYSVIPC_COMPAT=y
CONFIG_XFRM_IPCOMP=y
CONFIG_INET_IPCOMP=m
CONFIG_INET6_IPCOMP=y
#  CONFIG_TIPC is not set
#  CONFIG_SND_CMIPCI is not set

有关信息,我使用的代码是随 0MQ 示例提供的 flserver1 和 flclient1,也在The Guide中。

在自制应用程序的同一台 PC 上的其他地方,我成功地使用了popen,然后成功使用了fork和管道。

请问问题出在哪里?

编辑 2013-06-26 18:22 CET

如果我使用 tcp://127.0.0.1:5555 而不是 tcp://localhost:5555,它可以工作。我不明白,因为在我的 /etc/hosts 中声明了 localhost:

# grep localhost /etc/hosts
127.0.0.1    JANUS localhost
#::1        localhost

但这并不烦人,所以对我来说,套接字问题已经关闭。仍然是在我的 PC 上仍然无法运行的 ipc 传输(除非服务器和客户端都在同一个控制台中运行)。

4

1 回答 1

0

0MQ 不支持“localhost”端点。应该使用“127.0.0.1”代替。所以tcp://localhost:5555应该写成:tcp://127.0.0.1:5555

此处提供的原因。总而言之,0MQ 函数 bind 和 connect 支持数字地址,或带有通配符的符号地址。

于 2014-03-12T18:56:05.263 回答