2012-01-27 5 views
2

私はUNIXソケット( "/ tmp/mysocket")を監視しようとしています。libevent/libev:unixソケットを監視するCまたはC++

Node.jsでこれを行うことができます:1)ソケットがバインドされている、2)誰かがソケットに接続している、3)データがソケットに送信されている、4)ソケットが切断されている

私はこれをC/C++でやろうとしています。上記のイベントについては、 "/ tmp/mysocket"を監視したいと思います。私はlibevent(私が使用したいと思う)を見ましたが、IP:portが必要であることがわかります。 Unixソケットを監視する方法はありますか?

誰かが別のC/C++ソリューションを提案できますか?

答えて

5

通常のファイルと同じように、UNIXドメインソケットを監視することができます。これは、ファイルのように操作できるためです。 libevでは、

struct sockaddr_un address; 
memset(&address, 0, sizeof(address)); 
address.sun_family = AF_LOCAL; 
strcpy(address.sun_path, "/tmp/mysocket"); 

bind(socket, (struct sockaddr*)(&address), sizeof(address)); 
listen(socket, 5); 

// now listen if someone has connected to the socket. 
// we use 'ev_io' since the 'socket' can be treated as a file descriptor. 
struct ev_io* io = malloc(sizeof(ev_io)); 
ev_io_init(io, accept_cb, socket, EV_READ); 
ev_io_start(loop, io); 
... 

void accept_cb(struct ev_loop* loop, struct ev_io* io, int r) 
{ 
    // someone has connected. we accept the child. 
    struct sockaddr_un client_address; 
    socklen_t client_address_len = sizeof(client_address); 
    int client_fd = accept(socket, (sockaddr*)(&client_address), 
          &client_address_len); 

    // 'read'/'recv' from client_fd here. 
    // or use another 'ev_io' for async read. 
} 

libeventが似ています。

+0

こんにちは、その情報に感謝します。確かに非常に便利です。私はそれをコンパイルしようとするつもりです。私はlibevやlibeventの新機能です。あなたのコードを埋め込んで機能させるために少しの努力が必要です! – Eamorr

+0

こんにちはKennyTM - eve_io_init(...)の3番目のパラメータ 'socket'はどのタイプですか? – Eamorr

+0

@Eamorr: 'int'。ドキュメントを確認してください。 http://pod.tst.eu/http://cvs.schmorp.de/libev/ev.pod#code_ev_io_code_is_this_file_descrip – kennytm

関連する問題