2015-02-11 80 views
2

我在C(使用nanomsg),其应使用Python脚本(使用标准的 '插座' 实现)通信经由TCP创建套接字服务器C代码(没有错误处理):Socket连接

#include <nanomsg/nn.h> 
#include <nanomsg/pair.h> 
... 
char buf[23]; 
... 
socket = nn_socket(AF_SP, NN_PAIR); 
nn_bind(socket, "tcp://127.0.0.1:xxxxx"); 
... 
nn_recv(socket, buf, sizeof(buf), 0); 
... 
nn_shutdown(socket, endpoint_id); 

的Python代码:

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.connect(("127.0.0.1", xxxxx)) 
s.send('Hello C this is Python') 
s.close() 

连接到插座时(如果C应用程序正在运行)没有错误在Python。但是,C脚本在方法nn_recv中空转,并且根本没有获取任何数据。我究竟做错了什么?

首先,我在shell中启动C代码(它在方法nn_recv中空闲)。然后,我在另一个shell中启动Python,并期望C应用程序接收数据。这两个脚本执行没有错误。

+0

确定插座匹配的类型?不应该都是SOCK_STREAM或NN_PAIR。在不同的ZeroMq中,套接字只是等待连接,直到合适的套接字变为可用。 – hetepeperfan 2015-02-11 14:01:37

+0

研究图书馆的文档,看起来'nn_socker'必须具有'NN_PULL'标志用于这种特殊情况。 – Matt 2015-02-11 14:01:37

+0

在'“tcp://127.0.0.1:xxxxx”'中,是否将'xxxxx'识别为有效的端口?它应该是10000? – ryyker 2015-02-11 15:07:06

回答

3

问题是,nanomsg套接字类型不是普通的标准TCP类型。协议不匹配。您不能将TCP消息发送到nanomsg套接字,并且期望nn_recv可以工作,因为该消息将不符合定义的nanomsg SP协议要求。

见nanomsg SP协议头:

0    1    2    3 
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 
|  0x00  |  0x53  |  0x50  | version | 
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 
|    type    |   reserved   | 
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 

前四个字节的协议头的使用,以确保对等的协议与本地端点使用的协议兼容。

如果从对等方接收到的协议头不同,则立即关闭TCP连接MUST

这意味着对nanomsg套接字的任何原始TCP send都会终止连接,因为它不确认SP协议。

欲了解更多信息请咨询SP-TCP映射-01.txt文件here