問題タブ [berkeley-sockets]
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.
c# - Socket Shutdown: SocketShutdown.Both を使用する必要がある場合
シャットダウンシーケンスは次のとおりだと思います(ここで説明されているように):
MSDNのドキュメント(備考セクション) には次のように書かれています。
接続指向の を使用する場合は、 を閉じる前
Socketに必ずメソッドを呼び出してください。これにより、接続されたソケットが閉じられる前に、すべてのデータがそのソケットで送受信されるようになります。ShutdownSocket
これは、 を使用するShutdown(SocketShutdown.Both)と、まだ受信されていないデータがまだ消費される可能性があることを意味しているようです。これをテストするには:
- クライアントにデータを継続的に送信します(
Send別のスレッドを介して)。 - クライアントは を実行し
Shutdown(SocketShutdown.Both)ました。 BeginReceiveただし、サーバーでコールバックが実行されると、EndReceive例外がスローされます。既存の接続がリモート ホストによって強制的に閉じられました。0これは、戻り値を受け取り、次に呼び出すことができないことを意味しますShutdown。
リクエストに応じて、サーバー側のコードを以下に投稿しました (Windows フォームにラップされており、実験として作成されたものです)。私のテストシナリオでは、連続データを送信せずに通常行っていたように、 TCPViewCLOSE_WAITで状態を確認できませんでした。したがって、私は何か間違ったことをした可能性があり、その結果を誤って中断しています。別の実験では:
- クライアントがサーバーに接続します。
- クライアントが実行し
Shutdown(SocketShutdown.Both)ます。 - サーバーはシャットダウン確認を受信し、応答としてデータを送信します。サーバーも実行し
Shutdownます。 - クライアントはサーバーからデータを受信しましたが、次
BeginReceiveは許可されていません:ソケットが以前のシャットダウン呼び出しでその方向で既にシャットダウンされていたため、データの送信または受信の要求は許可されませんでした
このシナリオでは、ソケットからの0戻り値を期待していました。これは、代わりに使用する必要があることを意味しますか? もしそうなら、いつ使うべきですか?EndReceiveCloseShutdown(SocketShutdown.Send)Shutdown(SocketShutdown.Both)
最初の実験のコード:
sockets - setsockopt() が設定したタイムアウトを無効にする方法は?
私が開発しているプログラムでは、無期限にブロックするのsetsockopt()を防ぐために、を使用してタイムアウトを設定しました。recvfrom()タイムアウトを無効にするにはどうすればよいですか?
(私はUbuntuを使用しています)
c - epoll ET、リスニングソケットでどのイベントを購読する必要がありますか?
私はfdを持っています:
そして、私にはepollインスタンスがあります。を介してどのイベントを購読する必要があるかを知る必要がありepoll_ctlますか? エッジ トリガー モードが必要です。
私はそれらのフラグを持っています:EPOLLET | EPOLLIN
EPOLLRDHUP、、EPOLLOUTに登録する必要がありEPOLLPRIますか?
を処理する必要がEPOLLHUPありEPOLLERRますか? なぜそれらが発生するのですか?
c - C での IPv6 接続の問題
IPv4 と IPv6 の両方の接続を受け入れることができる不可知論的なエコー サーバーをコーディングしようとしています。getaddrinfo で設定された addrinfo 構造体を使用しています。
IPv4接続には問題はありませんが、ipV6接続が機能していません。私の問題は間違った getaddrinfo パラメーターが原因である可能性があると思いますが、どこが間違っているのかわかりません。
ここに私のコード
client.cがあります
server.c
c++ - UNIX ソケット ベースのクライアント プログラムの C++ connect() がサーバーへの接続を確立しない
有名なバークレー ソケット インターフェイスを使用して、CentOS 7.0 の c++ で簡単なソケット サーバーを作成しました。どのポートでも実行し、接続を待ちます。
次に、同じく C++ で記述された単純なクライアント プログラムを実行し、にリクエストを送信します
192.168.122.1(この IP は command を実行することで検出されますip addr) が、接続を拒否します。ファイアウォールが気になるので、httpd.service (APACHE) を停止し、ポート 80 で手順を実行しましたが、役に立たず、「接続が拒否されました」というエラーが表示されました。
私は何をすべきか?
** UPDATE 001 ** コマンドを実行するnetstat -lと、次の出力が得られます。
**更新 001の終わり** 出力は次のとおりです。
クライアント--> 接続が拒否されました
サーバー--> [待機中...]
コードは次のとおりです。
クライアント:
サーバ
c++ - Linux c++ recvfrom() は [socket] ファイル記述子を変更 (破棄) します
簡単なUDPサーバーを作成しました。当然recvfrom()、その中で function を使用します。ネットで検索したところ、バッファオーバーフローが原因であることがわかりました。これは本当ですか?しかし、コードが失敗して同じエラーがスローされる理由がわかりません。関連する部分は次のrecvfrom()とおりです。
の呼び出し前のファイル記述子recvfrom()はです3が、呼び出すと次のように変わります-187301886
c++ - Berkeley ソケットでのスレッド通知の使用
私は以下の方法で Berkeley ソケット選択機能を利用しています。
ソケットのコンテナー (別のクラスにラップ) を監視し、アクセス可能なソケットに関する情報を格納する別のコンテナーに ID を追加するクラスを作成しました。マップは unordered_map です。
多くの人が気づいていると思いますが、このコードは非常に高速に実行され、明日がないように CPU を食い尽くします (マップ内のソケットが 1 つしかない場合、CPU 使用率は 40% です)。私の最初の解決策は、1 秒あたりの反復回数を設定値に保つスマート待機関数を用意することでした。それは一部の人々にとっては問題ないようでした。 私の質問は次のとおりです: このメソッドを使用せずに、ソケットの準備ができたときに通知を受け取るにはどうすればよいですか? 移植性を維持するために大量のマクロジャンクが必要になる場合でも、それは問題ありません。オペレーティングシステムにそれを監視させ、ソケットの準備ができたときに何らかの通知またはイベントを受け取る方法があるとしか思えません。明確にするために、ドットネットを使用しないことを選択しました。
ループは独自のスレッドで実行され、ソケットの準備が整ったときにソフトウェアの他の部分に通知を送信します。全体がマルチスレッド化されており、そのすべての部分 (この部分を除く) はイベントベースの通知システムを使用して、ビジーな待機の問題を解消しています。物事がOSに依存し、この分野で制限されることを理解しています.
編集: ソケットは BLOCKING モードで実行されます (ただし、select にはタイムアウトがないため、ブロックされません) が、専用スレッドで操作されます。編集:システムは、スマートスリープ機能を使用すると優れたパフォーマンスを発揮しますが、何らかの通知システム(OSからの可能性が高い)を配置した場合ほど良くはありません。
