【问题标题】:Socket connection between C (nanomsg) and Python (non-nanomsg)C (nanomsg) 和 Python (non-nanomsg) 之间的套接字连接
【发布时间】:2015-02-11 13:48:05
【问题描述】:

我用 C 语言创建了一个套接字服务器(使用 nanomsg),它应该通过 TCP 与 Python 脚本(使用标准的“套接字”实现)进行通信:

C 代码(无错误处理):

#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()

连接到套接字时 Python 没有错误(如果 C 应用程序正在运行)。但是,C 脚本在方法 nn_recv 中处于空闲状态,根本没有得到任何数据。我究竟做错了什么?

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

【问题讨论】:

  • 你确定套接字的类型匹配吗?不应该都是 SOCK_STREAM 或 NN_PAIR。在不一样的 ZeroMq 中,套接字只是等待连接,直到合适的套接字可用。
  • 查看图书馆的文档,对于这种特殊情况,nn_socker 似乎必须有 NN_PULL 标志。
  • "tcp://127.0.0.1:xxxxx" 中,xxxxx 是否被识别为有效端口?应该是 10000 之类的吗?
  • 你见过这个nanomsg blog example吗?
  • xxxxx 在实际代码中被替换为有效端口。

标签: python c sockets python-2.7 nanomsg


【解决方案1】:

问题在于 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 连接必须立即关闭。

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

更多信息请查阅 sp-tcp-mapping-01.txt 文档here

【讨论】:

    猜你喜欢
    • 2018-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多