問題タブ [usocket]

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 投票する
1 に答える
385 参照

lisp - 単一のスレッドから、相手側がソケット ストリームを閉じたかどうかを確認するにはどうすればよいですか?

usocketのFAQでは、a から読み取って結果socket-streamを確認する方法が推奨されています。end-of-fileこれは、ソケットごとにアクティブなスレッドが 1 つある場合には機能しますが、同じスレッドで複数のソケットにサービスを提供しようとしている場合には満足できないようです。

次のようなものを検討してください

この演習では、実際に 4 つのクライアントが接続していると仮定します。1つのスレッドからそれらを提供する方法は次のようなものです

ただし、切断されたソケットは引き続き に戻りnil、メッセージのないアクティブなソケットからlistenの試みはブロックされますが、他のソケットにメッセージの準備ができていない場合でも、ミックス内に閉じられたソケットある場合はすぐに戻ります。 (ただし、どのソケットが返されたかを特定できないようです)。read wait-for-intput

しばらくクライアントが発言しておらず、3 番目のクライアントが切断された状況では、それを見つけてその特定のソケット接続を閉じる良い方法はないようです。read入力がないブロックであるため、最初の 2 つのクライアントが両方ともメッセージを送信するまでスレッドが待機することを除いて、それらを順番に読み取る必要があります。

私が念頭に置いているが、いくつかの決定的なグーグル検索の後に見つけられなかった解決策は、次のとおりです(好みの降順):

  1. ターゲットのストリームの読み取りがマーカーlistenを返す場合、それ以外の場合はそれと同等の関数が返されます。(上記をこの概念的な関数に置き換えると、残りの部分は書かれたとおりに機能します)tend-of-filelisten
  2. それ以外の場合はそれと同等の関数wait-for-inputは、トリップの原因となった閉じられたソケットのリストを返します。(この場合、閉じたソケットのリストを反復処理し、提案されたread手法でそれらが実際に閉じられていることを確認し、必要に応じて閉じたりポップしたりできます)
  3. それ以外は同等の関数wait-for-inputは、トリップの原因となった最初に閉じられたソケットを返します。(#2と同様ですが、反復ごとに非アクティブな接続を最大1つプルーニングするため、遅くなります)
  4. 各ソケット接続から入力を受信して​​からの経過時間を追跡し、一定期間非アクティブになった後は関係なくそれらを閉じます。(とにかくやりたいと思うかもしれませんが、これだけを行うと、必要以上に多くの切断された接続が保持される可能性があります)
  5. read-charインスタント タイムアウトでストリームからt取得しよう:eofとする関数。(自明ではないが致命的な方法で簡単に破れるように思われるため、これは最後の手段です)unread-charnil

また、これについて正確に間違った方法で考えている場合は、それも指摘してください。

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

webdev.webserver - Lisp の土地 src webserver.lisp

「land of lisp」の第 12 章と第 13 章で「socket」について学習していたときのことです。Lispbox を使っているので、ソケットをインストールする必要があります。これは、usocketを使用して Web サーバーを構築する方法に関するサンプルです。

http://landoflisp.com/webserver.lispの元の 'serve' 関数

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

http - Common Lisp usocket で http リクエストを送信するときの 400 Bad Request

次のコードを使用して URL を取得していますhttp://brandonhsiao.com/essays.html

これにより400 Bad Requestエラーが発生しますがhttp://brandonhsiao.com/essays.html、Firefox でアクセスすると、すべて問題ありません。私は何を間違っていますか?

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

websocket - usocket ライブラリを使用した Common Lisp の WebSocket クライアント

HTTP 1.1 から WebSockets に切り替えて、プロトコルをアップグレードしようとしています。usocketを使用しようとしました。これまでのコードは次のとおりです ( GitHub gistとして入手できます)。ハンドシェイクの読み取り後、関数はリターンNILまたはunexpected EOFエラーになります。

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

sockets - usocket を使用して接続を作成する方法は? (コモンリスプ)

Lispでソケットを使用して接続を作成しようとしています。sbcl を使用すると、「usocket」が利用可能であることがわかりました。しかし、サーバーとクライアントの間で文字列を送信できませんでした。コードは次のとおりです。

サーバ:

クライアント:

最初にサーバー コードを実行しましたが、フリーズします。次に、クライアント コードを実行しました。しかし、サーバーは無反応のようでした。文字列をstストリームにフォーマットしようとしました:

しかし、それは nil を返します。

どうすれば問題を解決できますか?? どうもありがとう。

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

network-programming - Usocket の符号なしバイト 8 はデータを受信しませんが、文字要素型はデータを受信します

USocket ライブラリで、本当に不可解な動作に遭遇しました。次のスニペットを検討してください。

なぜこうなった?へ:element-type '(unsigned-byte 8)の引数を省略するとusocket:socket-listen、問題なく動作します。任意のバイトを文字として表すことができないかどうかは理解できましたが (たとえば、utf-8 エンコーディングには無効なバイト シーケンスがあります)、逆 (バイトで表すことができない文字) は、特にネットワークでは意味がありません。環境。

(役立つ場合に備えて、Lubuntu 15.10、USocket 0.6.3.2 で clisp-2.49 を実行しています)。

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

common-lisp - シングルスレッドのシーケンス読み取りマルチユーザー usocket サーバー

usocket ライブラリを使用して、比較的単純なタスク (データのエコー バックなど) を実行する単純なサーバー プログラムを作成しようとしています。単一のクライアントからの入力を待っている間に単一のスレッドがブロックされないように、複数のクライアントでこれを実行できるようにしたいと考えています。wait-for-inputを使用して、特定のソケットに入力の準備ができているかどうかを確認できることがわかりました:timeout 0。でも、read-sequence思い通りに仕事ができなくて困っています。50 個の要素を持つ配列を指定した場合、5 個しか使用できない場合、50 個が使用可能になるまで待機してそれらを配列に入れます。

入力を常に待つことなく、単一のスレッドのみで一度に (効率的に) ブロックを読み取る方法はありますか? それとも、read-byteすべてを取得するまで何度も電話する必要がありますか?

read-sequenceその時点で利用可能な量だけを読み取るのと同等のものがある場合、または配列を適切にサイズ設定できるように、読み取る準備ができている要素の数を通知する関数があれば、問題を回避できます。しかし、私はそのどちらも知りません。

更新: 文字を読み取る必要のないバイナリ ソリューションを特に探しているのでread-char-no-hanglisten、 などを含むソリューションは、同等のバイナリがない限り、あまり役に立ちません。UTF-8 などの一部の文字エンコーディングには、文字表現のない無効なバイト シーケンスが含まれる可能性があるため、文字を処理したくありません。バイトのシーケンス。そして、私は特に、一度に1バイトずつ何度も読み取る必要のない解決策、またはそのような解決策が(標準に)存在しないことの確認のいずれかを探しています。その場合、最も便利な方法について聞きたいですそれを実現するために最低限必要なものを提供できるライブラリ。usocket一度に 1 バイトずつ読み取るのが最速の方法ではないというだけでなく、すべてのバイトに対して'swait-for-input関数を使用するために、ノンブロッキングの方法でそれを行うために私が書いた関数も必要です(listenバイトストリームでは機能しないため) )、関数がソケットについて知る必要がありread-all-bytes、たとえばファイルストリームでは機能しない過度に具体的な関数を作成する必要があります。それは可能ですが、もっと一般的な方法があることを願っています。

0 投票する
0 に答える
246 参照

common-lisp - Hunchentoot テスト Web サーバーの usocket 接続がエラーを拒否しました

Hunchentoot テスト Web サーバーを起動しようとしていますが、Mac OSX El-Capitan、SBCL 1.1.6.0-3c5581a で usocket が接続エラーをスローしています。

助けてください...