2017-06-09 3 views
2

私はライブラリを習得しようとしています。CとPythonの間でnanomsgのPub/Subをセットアップするには?

私は両方のバージョンCとPythonのコード例を使用しています。私はPythonスクリプトでCサービスを購読しようとしていますが、何も起こっていません。私は

./pubsub_demo tcp://127.0.0.1:5555 -s

を実行して、Cのコードを実行

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <time.h> 
#include <netinet/in.h> /* For htonl and ntohl */ 
#include <unistd.h> 

#include <nanomsg/nn.h> 
#include <nanomsg/pubsub.h> 

/* The server runs forever. */ 
int server(const char *url) 
{ 
    int fd; 

    /* Create the socket. */ 
    fd = nn_socket (AF_SP, NN_PUB); 
    if (fd < 0) { 
     fprintf (stderr, "nn_socket: %s\n", nn_strerror (nn_errno())); 
     return (-1); 
    } 

    /* Bind to the URL. This will bind to the address and listen 
     synchronously; new clients will be accepted asynchronously 
     without further action from the calling program. */ 

    if (nn_bind (fd, url) < 0) { 
     fprintf (stderr, "nn_bind: %s\n", nn_strerror (nn_errno())); 
     nn_close (fd); 
     return (-1); 
    } 

    /* Now we can just publish results. Note that there is no explicit 
     accept required. We just start writing the information. */ 

    for (;;) { 
     uint8_t msg[2 * sizeof (uint32_t)]; 
     uint32_t secs, subs; 
     int rc; 

     secs = (uint32_t) time (NULL); 
     subs = (uint32_t) nn_get_statistic (fd, NN_STAT_CURRENT_CONNECTIONS); 

     secs = htonl (secs); 
     subs = htonl (subs); 

     memcpy (msg, &secs, sizeof (secs)); 
     memcpy (msg + sizeof (secs), &subs, sizeof (subs)); 

     rc = nn_send (fd, msg, sizeof (msg), 0); 
     if (rc < 0) { 
      /* There are several legitimate reasons this can fail. 
       We note them for debugging purposes, but then ignore 
       otherwise. */ 
      fprintf (stderr, "nn_send: %s (ignoring)\n", 
       nn_strerror (nn_errno())); 
     } 
     sleep(10); 
    } 

    /* NOTREACHED */ 
    nn_close (fd); 
    return (-1); 
} 

/* The client runs in a loop, displaying the content. */ 
int client (const char *url) 
{ 
    int fd; 
    int rc; 

    fd = nn_socket (AF_SP, NN_SUB); 
    if (fd < 0) { 
     fprintf (stderr, "nn_socket: %s\n", nn_strerror (nn_errno())); 
     return (-1); 
    } 

    if (nn_connect (fd, url) < 0) { 
     fprintf (stderr, "nn_socket: %s\n", nn_strerror (nn_errno())); 
     nn_close (fd); 
     return (-1);   
    } 

    /* We want all messages, so just subscribe to the empty value. */ 
    if (nn_setsockopt (fd, NN_SUB, NN_SUB_SUBSCRIBE, "", 0) < 0) { 
     fprintf (stderr, "nn_setsockopt: %s\n", nn_strerror (nn_errno())); 
     nn_close (fd); 
     return (-1);   
    } 

    for (;;) { 
     uint8_t msg[2 * sizeof (uint32_t)]; 
     char hhmmss[9]; /* HH:MM:SS\0 */ 
     uint32_t subs, secs; 
     time_t t; 

     rc = nn_recv (fd, msg, sizeof (msg), 0); 
     if (rc < 0) { 
      fprintf (stderr, "nn_recv: %s\n", nn_strerror (nn_errno())); 
      break; 
     } 
     if (rc != sizeof (msg)) { 
      fprintf (stderr, "nn_recv: got %d bytes, wanted %d\n", 
       rc, (int)sizeof (msg)); 
      break; 
     } 
     memcpy (&secs, msg, sizeof (secs)); 
     memcpy (&subs, msg + sizeof (secs), sizeof (subs)); 

     t = (time_t) ntohl(secs); 
     strftime (hhmmss, sizeof (hhmmss), "%T", localtime (&t)); 

     printf ("%s <pid %u> There are %u clients connected.\n", hhmmss, 
      (unsigned) getpid(), (unsigned) ntohl(subs)); 
    } 

    nn_close (fd); 
    return (-1); 
} 

int main (int argc, char **argv) 
{ 
    int rc; 
    if ((argc == 3) && (strcmp (argv[2], "-s") == 0)) { 
     rc = server (argv[1]); 
    } else if (argc == 2) { 
     rc = client (argv[1]); 
    } else { 
     fprintf (stderr, "Usage: %s <url> [-s]\n", argv[0]); 
     exit (EXIT_FAILURE); 
    } 
    exit (rc == 0 ? EXIT_SUCCESS : EXIT_FAILURE); 
} 

Pythonの加入者

from __future__ import print_function 
from nanomsg import Socket, PAIR, PUB 
s2 = Socket(PAIR) 
while(True): 
    s2.connect('tcp://127.0.0.1:5555') 
    s2.send(b'hello nanomsg #1') 
    s2.send(b'hello nanomsg #2') 
    s2.close() 

Cコード:

は、ここに私のコードの両方です

あなたのおかげでありがとう

+0

Cデバッガの使用方法を学ぶ時間。 –

+0

@AnttiHaapala @AnttiHaapalaこのようなCデバッガはありません。これは、互換性のないScalable Formal Communication PatternをISO-上で試行したように、** PAIR' ** archetypeは** PUB' ** -lisherと一緒に "話す"ことは決してできません。 Cのデバッガでこれを手助けすることはありません。より良い問題領域の知識が得られるでしょう。 (クールなスキル - "MS DOS games" - 確かに:o)) – user3666197

+0

@ user3666197すべての点を尊重しながら、 "何も起こらない"というのは問題の説明ではありません。だからこそ私はCのデバッガを使ってどこかで*何かが起きていることを確認することを提案したのです。 –

答えて

2

Cコードはよく見えます。それはhereから来ます。

さらに簡潔なバージョンのC NN_PUBサーバとNN_SUBクライアントexistsです。

Pythonコードにはいくつか問題があります。

1)では、と一致する必要があります。behavioural- "protocols"。 CサーバからブロードキャストNN_PUBを受信するには、SUBと一致する必要があります。PAIRソケットはPython側ではありません。

2)にnn_bind() -s NN_PUBソケットと同じendpoint- transport-class://address:portに接続します。ループの中でそれを行う必要はありません。

3)ソケットはSUB_SUBSCRIBEオプションが設定されていなければなりません。

4)SUBソケットは、受信するためのもので、.send()には対応していません。

次のようにテストされていないPythonプログラムがイン原則に見えることがあります。

# import appropriate modules for the nanomsg socket 
from nanomsg import Socket, PUB, SUB, SUB_SUBSCRIBE 

# open Python's SUB socket matching the NN_PUB socket on the C side 
s2 = Socket(SUB) 
# s2 should be >= 0 

# connect the socket to the same endpoint as NN_PUB server 
ret1 = s2.connect('tcp://127.0.0.1:5555') 
# ret1 should be 0 

# subscribe to everything: 
ret2 = s2.set_string_option(SUB, SUB_SUBSCRIBE, '') 
# ret1 should be 0 

# receive messages: 
while(True): 
    message = s2.recv() 

また、私はそれが役に立てば幸いPythonのテストでPUB/SUB example

を見ることができます。

関連する問題