問題タブ [libev]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
2 に答える
915 参照

data-structures - libevウォッチャーのデータ構造

Libevは、3つのデータ構造を使用して、さまざまなウォッチャーを格納します。

ヒープ:ev_timerやなどの時間でソートされたウォッチャー用ev_periodic

リンクリスト:ev_io、、などev_signalev_child

配列ev_prepare、、などev_checkev_async

ヒープを使用してタイマーウォッチャーを格納することは間違いありません。しかし、リンクリストと配列を選択する基準は何ですか?

ev_ioウォッチャーを格納するデータ構造は少し複雑に見えます。これは最初にfd、インデックスとしての配列であり、配列内の要素はのリンクリストですev_io watcher。リンクリストを要素として使用する場合は、配列にスペースを割り当てる方が便利です。それが理由ですか?

または、の挿入または削除操作ev_ioがより頻繁で、ev_prepareより安定しているように見えるという理由だけで?

または他の理由はありますか?

0 投票する
3 に答える
1713 参照

openssl - 非ブロッキングソケットでlibevを使用したOpenSSL読み取りクライアント証明書エラー

私は自分の問題を分析してデバッグするためのより良い方法を探してインターウェブを検索することに時間を費やしましたが、解決策を見つけることができないようです。だから私は尋ねると思いました。

簡単に言えば。ノンブロッキングのSSL転送プロキシを作成しようとしています。プロキシのサーバー部分は、自己署名サーバー証明書を使用しています。これは、自分のCA証明書を使用して署名しました。重要な場合は、libevを使用しています。最初に暗号化されていないプロキシを正常に作成し(Webトラフィックを盲目的に転送しました)、現在SSLを追加しようとしています。:)

クライアントをプロキシに接続する際に問題が発生します。自動テストが必要だったので、テストクライアントとしてwgetとsslの両方のs_clientを試しました。

sslサーバーのセットアップ(このコードは、EV_READイベントでlibevウォッチャーリスニングソケットaccept_handler()から呼び出されます):

libevループは次のように設定されました。

シャットダウンフラグやその他のハウスキーピングアクティビティをチェックするためのタイマーなどがあります。

私のclient_handshake()メイン関数は基本的に次のようになります。

client_info_cb()で、進行中に内部SSL状態を出力し、print()関数から次の情報を取得します。

そして、これはそれがぶら下がっているところです。SSL_ERROR_WANT_READ(上記の2番目の「クライアント証明書Aの読み取り」メッセージの後にSSL_get_error()が返すもの)を検出した場合は、client_handshake()関数をSSL_accept()の周りでloop(1){}に変更してみました。

それは私を無限ループに陥らせ、SSL_accept()を継続的に呼び出しました。

SSLステートマシンには、取得できない追加情報が必要であると想定しています。最初はソケットから読み続ける必要があると思いましたが、うまくいきませんでした。

また、上記のクライアント証明書(SSL_VERIFY_NONE)を検証したくないことを明示的に指定したため、プロキシがクライアント証明書を読み取ろうとしている理由についても混乱しています。その機能の目的を誤解していない限り。

誰かがこれについて何か洞察を持っているなら、私は感謝するでしょう。または、おそらくこの問題をデバッグするためのより良い方法です。strace()はこれには役に立たず、wgetまたはs_clientから適切なリターン/エラーメッセージを受け取りません。

SSLのステートマシン内でalert_callbacksとmsg_callbacksを設定しようとしましたが、情報コールバックよりも多くの情報が得られませんでした。

この時点では、それがソケットの問題なのか、SSLの問題なのか、それとも何なのかわかりません。

edit1:accept_handler()では、accept()を終了する前に、プロキシしているホストの証明書を検証するために、最初にsslを介してサーバーに接続していることを指摘しておきます。操作の順序を逆にして、connect()を接続する前に最初にaccept()を実行すると、機能します。

edit2:s_clientとプロキシの間のtcpdump出力を確認してみました。client_info_cbで参照されているサーバーデータの書き込みとデータのフラッシュの後、クライアントは「クライアントキー交換」、「暗号仕様の変更」、および「暗号化された終了メッセージ」を送信します。ただし、SSLステートマシンはクライアント証明書を探していますか?

0 投票する
2 に答える
927 参照

events - epoll/libevent/libev は UDT で動作しますか?

何万ものアクティブなソケットを処理する必要がある高同時実行サーバーを構築しています。最初に epoll を使用してイベントベースのサーバーを構築しましたが、適度な規模 (数千のアクティブなソケット) でうまく機能しました。しかし、同時実行数が 10,000 ソケットを超えると不安定になるようです。libevent(または libev) は成熟したプロジェクトであり、「何万ものアクティブなソケットを処理できる」と主張しているため、私は libevent(または libev) について検討しています。

「信頼できるUDP」であり、オーバーヘッドとメモリ使用量のためにTCPに問題が発生し始めているため、UDTの使用も考えています。したがって、イベント フレームワークとして libevent を使用し、送信プロトコルとして UDT を使用するのが自然な考えです。UDT が独自の一連の epoll 操作を提供していることは知っています。通常の Linux epoll では動作しないということですか? その場合、libevent や libev は Linux epoll に基づいて構築されているため、動作しません。

UDT と epoll/libevent/libev の両方で作業した人はいますか? UDT はそれらのいずれとも連携できますか?

どんな助けでも大歓迎です。ありがとう。

0 投票する
1 に答える
924 参照

c - コンパイル時のLibevエラー

gcc -g -Wall -Wextra -DNDEBUG -pedantic -ansi フラグを使用してコードをコンパイルし、libev ライブラリを使用しようとしています。日食で次のエラーが発生します。

libev-dev パッケージを ubuntu にインストールしました。

0 投票する
1 に答える
317 参照

c# - C でのイベントの発生と処理

一部の C# コード (主にクラス) を C に移植しています。コードを分析したところ、移植は確実に可能です。私が確信していないことの 1 つは、C で発生するイベントを処理 (つまり、実装) する方法です。

私は Linux 環境にいますが、バイナリは Linux でのみ実行されることを期待しています。GLib はイベントをサポートしていると聞きましたが、これについてはあまり知りません。助けていただければ幸いです。

イベントを発生させて C で処理する Hello World の例は非常に役立ちます。

0 投票する
1 に答える
1586 参照

c++ - libev はソケットをタイムアウトなしでブロッキングに設定します

Rant: 私はboost::asioが本当に嫌いなので、代替案を探していて、libevに出会いました。これは私には十分に単純に思えますが、理解できないいくつかのことを行っています。1 つのスレッドで質問が多すぎる場合は、お知らせください。

1)リスニングソケットをNON_BLOCKに設定し、受け入れられた各着信接続もNON_BLOCKに設定しましたが、コードのどこかでソケットがBLOCKに変わります。元:

メインループもブロックしないようにしました:

しかし、それは違いを生んだようには見えません。ドキュメント (インターネット上で入手できる唯一のドキュメント ソース) にリダイレクトしないでください。私はそれを読みました。

受け入れられたクライアントソケットに対してこれを行います:

それでも、読み取りコールバックが実行されるたびに、ソケットは魔法のように BLOCK に設定されます

2) ソケットのタイムアウトを設定しようとしました: struct timeval timeout;

(ここから取得:この質問) それは単に機能しません。これは、ソケットが BLOCKing モードにリセットされたためですか?

3) libev の C++ ラッパーを見たことがあります。コールバックを静的関数にしなければならないという事実は絶対に嫌いです。それは私にとってすべてを台無しにします。それでも、私が見たすべての例は次のように使用されています。

おかしなことに、次のものが生成されます。

エラー: 'struct ev::loop_ref' には 'break_loop' という名前のメンバーがありません エラー: 'struct ev::default_loop' には 'run' という名前のメンバーがありません</p>

Debian Squeeze で。

だから、私が求めているのは:

  1. 何、誰、ソケットが NON_BLOCK から BLOCK に変更されたのはどこですか?
  2. ソケットのタイムアウトを設定する方法 (場合) (ブロックまたは非ブロック)
  3. ev++.h の何が問題なのですか? また、なぜ私が使用できないラッパーを使用しているのですか?

ソケットを使用してデータを読み取ったり送信したりできますが、タイムアウトなしでブロックする方法であることに注意してください。さらに、これはサーバーであるため、接続されたクライアントごとにメッセージを保存する必要があるため、コードをクラスに保持する必要があります。この静的メソッドまたは非クラス メソッドを作成すると、単にそれが台無しになるか、非常に異なるアプローチを取らざるを得なくなります。

PS: libev に代わるものはありますか?

0 投票する
1 に答える
3992 参照

c - c libev`ev_default_loop'への未定義の参照

私はubuntuでgccコンパイラを実行しています。例を使用してlibevとソケット接続を確立する方法を学習しています。libev4とlibev-devがインストールされていますが、struct ev_loop * loop = ev_default_loop(0);を追加する場合を除いてすべて正常に動作します。未定義の参照エラーがスローされます誰かがここで何が間違っているのか教えてください私のコードです

マークした複数のエラーが発生します。何が問題なのか教えてください。多くの検索を行いましたが、何も見つかりませんでした。

0 投票する
1 に答える
102 参照

sockets - チャイルズでイベントを受け取る

libevを使用してtcpサーバーを作成しています。ソケットを作成し、listen() の後に fork してから、libev read watcher を listen ソケットで開始し、watcher コールバックでクライアント接続を受信して​​います。子と親 (複数ある場合は 2 つの子) の両方が、リッスンしているソケットが読み取り可能になったというイベントを受信し、両方が accept() クライアント接続を試行し、この場合、プロセスの 1 つがブロックされる場合がありますか? テスト プログラムを書いたところ、read-ready イベントを受け取るプロセスは 1 つだけのようですが、間違っているのでしょうか? この場合のシステムの動作についてどこで読むことができますか? カーネルはどのようにプロセス間の負荷分散を行い、誰がイベントを受け取るかを決定しますか? バックエンド (select、epoll など) および/または OS 固有ですか?

0 投票する
1 に答える
384 参照

c - evbuffer_add_printf が静的変数のみを受け入れ、「動的」変数を受け入れないのはなぜですか?

これまでのところ、 「OMP OMP」という静的文字列を正常に返すlibevコードを取得しましたが、「静的」文字列を返す関数を作成すると、機能しないようです。(補足: アイデアは、同じ関数を動的応答に変えることですが、アジャイル テストの目的のためだけに、これを最初に機能させる必要があります)。libev read コールバックの私のコードは次のとおりです...

parse_json_command関数は次のとおりです...

完全なコード (この記事の執筆時点では数ページしかありません) を見たい場合は、次のリンクからソース コードにアクセスできます: https://github.com/Xenland/P2PCrypt-Server

お時間をいただきありがとうございます。