問題タブ [winsockets]
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++ - C++でSSPIを使用して安全な接続を実装する-いくつかの用語を明確にする
MicrosoftAPIを使用してクライアントとサーバー間の安全な接続を実装するアプリケーションを作成する必要があります。グーグルは私にたくさんの結果を与えます、そして私は大きな混乱を持っています-私の頭の中で私にいくつかの注文をするために誰かが必要です:
質問:
- SSPIインターフェイスとは何ですか?Schannel.dllライブラリとは何ですか?違いは何ですか?(「SSPI.h」と「Schannel.h」と「security32.h」をインクルードできることがわかります。本当に必要なヘッダーファイルはどれですか?)
安全なソケットを作成する方法を説明する実際の簡単なサンプルを見つけるにはどうすればよいですか?
始める前に知っておくべきガイドラインはありますか?
よろしくお願いします。
tcp - 正確に2つのIPアドレスからのTCP接続の受け入れ
Winsockを使用してTCPサーバーアプリケーションを作成しています。私に接続するクライアント(ソースがないため変更できない)は、次のように動作します。接続して接続を閉じると(不要なクライアントであるため)、すぐに再接続します。この結果、私に接続したいが話したくないクライアント(つまり、私が望ましくないクライアントと呼んでいるもの)がそこにいる場合、accept()呼び出しに狂ったように回転します。 。
私は、accept()呼び出しでその狂気が回転するのを防ぐ方法を見つけたいと思います。必要なクライアントが1つしかない場合は、リスニングソケットをINADDR_ANYではなくそのクライアントのIPアドレスにバインドできます。しかし、残念ながら、希望するクライアントは1つ以上あります。私の知る限り、目的のIPアドレスのセットのサイズが1より大きい場合、そのセットからの接続のみを許可する方法はありません。
WSAAcceptを見てきました。残念ながら、これは単に狂った回転をコールバックにシフトするだけのようです。
accept()がウェイクアップして戻ることを伴わない(したがって、このすべての狂った回転につながる)接続の試行を拒否する方法はありますか?
c# - 非同期ソケット クライアントの自動再接続
C# で Windows フォーム アプリケーションを使用しています。サーバーに非同期で接続しているソケット クライアントを使用しています。何らかの理由で接続が切断された場合、ソケットがサーバーにすぐに再接続しようとするようにします。私の受信ルーチンは次のようになります
NotifyClientStatusSubscribers(false) が呼び出されると、関数 StopClient が実行されます。
ここで、次の関数を呼び出して再接続を試みます。
接続が利用可能になるとソケットは再接続しますが、数秒後に次の未処理の例外が発生します:「接続要求は、既に接続されているソケットで行われました。」
これはどのように可能ですか?
sockets - ソケットと複数の IP アドレス
私のマシンには、2 つの別々の IP アドレスで構成された 2 つのインターネット カードがあります。どちらの IP アドレスも同じネットワークの一部です。ソケットを作成すると、これらの IP アドレスのいずれかに固有であると言うのは正しいですか?
アップデート:
これが私の状況です:
192.168.0.10 にあるハードウェア デバイスがあります。udp 経由で (192.168.0.11, 50000) および (192.168.0.12, 50000) に通信します。ハードウェア デバイスは、(192.168.0.10, 49000) と (192.168.0.10, 49001) の 2 つのポートを介してこれを行います。
スクリプトを使用してポート (192.168.0.11, 50000) と (192.168.0.12, 50000) を作成し、通信をログに記録して操作できるようにします。データは、ハードウェアと通信できる 2 つのシミュレーターに転送されます。
したがって、実際には、私のスクリプトは「中間者」であり、ハードウェアをテストする目的でデータをログに記録して破損させます。
私のスクリプトのソケットインターフェースは次のとおりです。
これは期待どおりに機能し、正しいデータがチャネルごとにログに記録されます。
ただし、次の 2 つの簡単な変更を行うと、機能しなくなります。
1) 2 番目のシミュレーターの構成ファイルを 60002 から 50002 に変更し、IP アドレスは 192.168.0.12 のままにします。
2) 私のスクリプトでは、IP2 用に 60002 を 50002 に変更しています。
突然、2 番目のチャネルからのデータが最初のシミュレータに到着します。どうすればいいの?.netにはIPAnyがあり、シミュレーターがこれを何らかの形で使用していて、構成ファイルのIPアドレスを無視しているかどうか疑問に思っています。それがここの問題かもしれないと思いますか?
ありがとう、
バリー
winsock - WinSock エラー 10061
winsock を使用して単純なクライアント/サーバー アプリケーションを作成しました。サーバーとクライアントは、localhost の TCP ポート 76567 (私が選んだランダムな番号) を介して接続し、通信します。私は 3 台のデスクトップでテストしました。2 台は XP を実行し、もう 1 台は Win7 を実行しています。また、4 台のラップトップでテストしました。3 台は Win7 を実行し、1 台は XP を実行しています。アプリケーションはすべてのデスクトップ マシンと XP ラップトップで正常に動作しますが、クライアントがサーバーに接続しようとすると、3 台の Win7 ラップトップすべてでエラー 10061 が発生します。
ファイアウォールをオフにしましたが、問題は解決しません。また、このエラーの原因を調べてみたところ、クライアントがリッスンしていないサーバーに接続しようとしているようです。ただし、listen() へのサーバー呼び出しは正常に返されます。問題が Win7 ラップトップでのみ発生するように見えるのは非常に奇妙ですが、アイデアはありますか?
これが私のソケット初期化コードです:
どうもありがとう :)
c++ - Winsock-クライアントをサーバーの基本に再接続する-TIME_WAIT
TCPサーバー/クライアントをセットアップしていて、それらは私が一般的に望む方法で通信します。
私が今やりたいのは、接続が失われたときにクライアントがサーバーに自動的に再接続できるようにする機能を追加することです。これを行う方法に関する完全な情報をオンラインで見つけるのに苦労しています。
詳細:-私はサーバーを1つしか持っておらず、これまでのところ、最大で1つの接続しかホストしていません。-クライアントまたはサーバーのいずれかが切断された場合-両方を閉じます(このようにサーバーとクライアントの両方のソケットを閉じるのが賢明ですか?)
理想的には、クライアントが毎回サーバー上の同じポートに再接続できるようにしたいと思います。TIME_WAITとそれが必要な理由を理解しています。別のオプションがない限り、SO_REUSEADDRを実際に使用したくありません。これは一般的にどのように処理されますか?古いソケットがTIME_WAITを終了するのを待っている間に、サーバー側で新しいポートを開き、基本的に2つのポートを交互に切り替える必要があります(つまり、クライアントは2つの可能なポートを追跡する必要があります)。
あなたの提案をありがとう!
visual-c++ - 送信操作の Winsocket タイムアウト
vc++ 2008 で TCP ソケット アプリケーションを作成しました。「送信」操作に x 秒以上かかる場合はタイムアウトさせたいです。そのために私は使ってみました
char *optValue = "5000";
setsockopt(socket, SOL_SOCKET, SO_SNDTIMEO, optValue, sizeof(optValue));
成功を返しますが、「送信」は期待どおりに動作しませんでした。次に、で試しました
tv.tv_sec = 10;
tv.tv_usec = 0;
FD_SET(accept_socket, &write_mask);
select(socket, (fd_set *)0, &write_mask, (fd_set *)0, &tv);
それでも「送信」は、設定されたタイムアウト値に従って動作していません。正しい方法であるかどうかを確認してください。
c++builder - c++ ビルダー TClientWinSocket シンボル置換
次の問題があります。テキスト テレグラムを tcp/ip 経由でホスト デバイスに送信する必要があります。テレグラムは 0x1A (CTRL-Z) 文字を使用して終了する必要があります。しかし、私がそれを送ると、ホストはテレグラムに間違ったシンボルがあると私に言いました. テレグラムを 32 (0x20) で終了すると、すべて問題ありません。WireShark を使用して転送されたデータを調べたところ、0x1A を送信すると 0x16 に置き換えられ、ターミネータとして 32 (0x20) を送信すると 0x1A に置き換えられていることがわかります。
説明してください。
PS 私は c++builder xe2 を使用して Windows 7 で作業しています。
ありがとう、ウラジミール
multithreading - winsock アプリケーションとマルチスレッド - 別のスレッドからのソケット イベントをリッスンする
winsock を使用して tcp 通信を実装するアプリケーションがあるとします。ソケットごとにスレッドを作成し、その上でブロック受信します。データが到着したら、他のスレッド (リッスン スレッド) に通知したいと考えています。
これを実装する最良の方法は何だろうと思っていました:
この設計から離れてノンブロッキング ソケットを使用すると、リッスン スレッドは絶えず反復してノンブロッキング受信を呼び出す必要があるため、スレッド セーフになります (ソケット用の余分なスレッドはありません)。
非同期プロシージャ コールを使用してリスニング スレッドに通知します。この場合も、apc がキューに入るのをアラート待機する必要があります。
各ソケットスレッドがメッセージを投稿するスレッドセーフなメッセージキューを実装し、リスナーは間隔ごとにそれを調べてそこからデータを取得します。
また、WSAAsyncSelect について読みましたが、これがメッセージをウィンドウに送信するために使用されていることがわかりました。他のスレッドに似たようなものはありませんか?(まあ、apcsは...だと思います)
ありがとう!
c - Accept 呼び出しは 2 回目 (または複数回) をブロックしませんか?
次のコードがありますが、なぜ正しく動作しないのかわかりません。
accept() 呼び出しをループし、指定された
スレッドごとに。
問題は、受け入れが時々ブロックされないことです。
理論的に接続がないときに新しいスレッドを開くプログラム。
それがループです -
各関数への独自のラッパーを使用します。
AcceptConnection には以下のコードがあります -
ブラウザからサーバーに接続すると問題が発生します。
例えば 、
最初のスレッドが完了した後 (メインスレッドを一時的に 5 秒間スリープさせることでこれを確認しました)
すべてをクリーンアップし、クライアント ソケットを閉じます。
ただし、2番目の受け入れ呼び出しでは-同じで返されます
SOCKADDR 情報が表示され、余分なスレッドが発生します。
まったく同じデータを受信し、まったく同じデータを送信します。
そして、2回(時にはそれ以上)印刷します:
「サーバー応答メッセージが送信されました。」
なぜこれが起こるのか理解できませんでした。うまくいけば、皆さんが私を助けてくれます.
ありがとう !