2015-02-11 120 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