問題タブ [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 - (S)NTPパケットの宛先タイムスタンプを決定しますか?
Berkeley sockets APIを使用してCで単純なSNTPクライアントを作成しようとしていますが、応答メッセージから調整された時間を計算するのに問題があります。これはRFC2030から入手しました。
サーバーの応答を受信すると、クライアントは宛先タイムスタンプ変数をNTPタイムスタンプ形式のクロックに従って到着時刻として決定します。次の表は、4つのタイムスタンプをまとめたものです。
- Originate Timestamp(T1):クライアントから送信された時間要求
- タイムスタンプの受信(T2):サーバーが受信した時間要求
- タイムスタンプの送信(T3):サーバーから送信された時間応答
- 宛先タイムスタンプ(T4):クライアントが受信した時間応答
私が知る限り、クライアントの時間を取り、それに時間オフセットtを追加することで、調整された現在の時間を計算できます。時間オフセットは次のように定義されます。
この計算を行うにはT4を知る必要がありますが、それはパケットのメッセージの一部ではありません。このタイムスタンプを取得するにはどうすればよいですか?
sockets - TCP ソケットの読み取りは常にブロックされます
5秒ごとに数バイトを書き込むクライアントTCPソケットがあり、サーバーはバイトをすぐにエコーバックします。
Connect()とwrite()は正常に機能し、サーバーのエコーを通知する IP レイヤーにコールバックがあります。これは、送信間で確実に発生します。
しかし、ソケットからエコーを読み取るのに問題があります。
select()を使用して、着信エコーを通知しようとしました。奇妙なことに、ソケットを閉じるまでコールバックは呼び出されませんでした。ただし、これらの呼び出しのそれぞれについて、read()は -1/WOULD_BLOCK を返しました。
私の 2 番目のアプローチは、IP レイヤーが着信データを通知したときにread()を非同期的に呼び出します。同様に、read()は -1/WOULD_BLOCK のみを返します。read()がデータをソケット層に打ち負かす可能性があることは理解していますが、うまくいけば、次の書き込み後にさらに読み取ることを意味するだけです。
私は IP/ソケット初心者であり、select アプローチの動作が非常に奇妙だったので、どういうわけか API を誤用していると思う傾向があります。
ほぼ同じコード パスが UDP モードで完全に機能するため、これはばかげたバグではありません。唯一の違いは、UDP の場合、DATAGRAM モード、sendto()、および recvfrom() を使用することです。TCP の場合、STREAM モード、write()、および read() を使用します。
c - 特定の文字がバッファに入るまでソケットから読み取る
を使用して特定の文字に到達するまで、ソケットからバッファに読み込もうとしていますread(fd, buf, BUFFLEN)
。
たとえば、ソケットは1回の読み取り呼び出しで空白行で区切られた2つのロットの情報を受け取ります。
読み取り呼び出しをループに入れて、この空白行に達すると停止し、必要に応じて後で残りの情報を読み取ることができるようにすることはできますか?
c++ - C/C++ でゲートウェイ アドレスを取得する
ioctl()
ゲートウェイアドレスを設定するために使用SIOCADDRT
します(RTF_GATEWAY
フラグで)。
それを取得するための標準的な ioctl ルーチンは何ですか?
c++ - TCP接続は受け入れられましたが、データを書き込むと古い接続が使用されます
サーバー(192.168.1.5:3001)は、Linux 3.2を実行しており、一度に1つの接続のみを受け入れるように設計されています。クライアント(192.168.1.18)は、Windows7を実行しています。接続はワイヤレス接続です。どちらのプログラムもC++で記述されています。
これは、10回の接続/切断サイクルで9回うまく機能します。10番目の(ランダムに発生する)接続では、サーバーが接続を受け入れ、後で実際に書き込みを行うと(通常、30秒以上後)、Wireshark(スクリーンショットを参照)によると、古い古い接続に書き込みを行っているように見えます。クライアントが(しばらく前に)FINしたポート番号を使用しますが、サーバーはまだFINしていません。そのため、クライアントとサーバーの接続が同期していないように見えます。クライアントは新しい接続を確立し、サーバーは前の接続への書き込みを試みます。この壊れた状態になると、後続のすべての接続試行は失敗します。壊れた状態は、最大ワイヤレス範囲を30分超えることで開始できます(10の場合の9の前のように、これは機能しますが、壊れた状態が発生する場合があります)。
スクリーンショットの赤い矢印は、サーバーがデータの送信を開始したとき(Len!= 0)を示しています。これは、クライアントがデータを拒否し、サーバーにRSTを送信した時点です。右端にある色付きの点は、使用されているクライアントポート番号ごとに1つの色を示しています。その色の残りのドットがあった後、1つまたは2つのドットがどのように表示されるかに注意してください(そして時間列に注意してください)。
サーバープロセスを強制終了して再起動すると、(次に発生するまで)自動的に解決されるため、問題はサーバー側にあるように見えます。
うまくいけば、コードはあまりにも異常ではありません。listen()のキューサイズパラメータを0に設定しました。これは、現在の接続を1つだけ許可し、保留中の接続を許可しないことを意味すると思います(代わりに、1を試しましたが、問題はまだありました)。コード内で「//error」が表示されているトレースプリントとして表示されるエラーはありません。
したがって、accept()呼び出し(SYNパケットが送信される時点であると想定)とwrite()呼び出しの間のどこかで、クライアントのポートが以前に使用されたクライアントポートに変更されます。
したがって、問題は、サーバーが接続を受け入れて(したがって、ファイル記述子を開き)、以前の(現在は古くて死んでいる)接続/ファイル記述子を介してデータを送信するのはどうしてですか?欠落しているシステムコールに何らかのオプションが必要ですか?
c - BSD/POSIX ソケットを使用したポータブル IPv6 接続
IPv6 アドレスに接続する必要があります。これはハードコードされていません。IPv6 アドレスをバイト形式 (char *) で取得しますが、DNS を使用してそれらを取得することはできません (getaddrinfo ではうまくいきません)。問題は、私が入力することになっている sockaddr_in6 構造が、プラットフォームによって完全に異なることです。
生のアドレスバイトからIPv6アドレスに接続するための移植可能な良い方法があれば?
libeventも使用していることにも言及する必要があります。
c - Berkeley ソケット: connect() は -1 を返し、errno は ENOENT に設定されます
私はこのコードを持っています:
IPv6 を false に設定し、IP を ::ffff:127.0.0.1 (IPv4 ループバック アドレス) に設定し、ポート番号を 45562 に設定し、res を -1 に設定し、errno を ENOENT (2) に設定します。これはなぜでしょうか?
私が使用しているプラットフォームは OSX Mountain Lion です。libevent バージョン「2.0.19-stable」のソケットを使用しています。
ありがとうございました。
linux - Linuxでのwifiインターフェースとのバインディング
LAN と WIFI の両方のインターフェイスを備えた Linux ベースのシステムで作業しています。しかし、ソケットをwifiインターフェースのみにバインドする必要があります。どのインターフェースがwifiであるかを調べる一般的な方法はありますか? そうでない場合、両方のインターフェースからリクエストをバインドして受信できる方法はありますか?
現在、INADDR_ANY を使用してバインドしています。eth0 のような特定のインターフェイスにバインドする方法は知っていますが、eth0 が wifi インターフェイスかどうかを判断する方法が見つかりません。少なくともC. INADDR_ANYを使用すると、任意のインターフェースに送信されたパケットを受信できますが、送信はLANインターフェースを介して送信しようとする場合があります。これは私が望むものではありません。
c - バークレーソケット通信、構造体の送受信
ゲームのスコアサーバーを実装する割り当てがあります。ゲームが完了すると、ゲームは登録のためにプレーヤーの名前(char * name)とスコア(intスコア)をサーバーに送信し、receive()し、サーバーは5つのトップスコアを送り返します。
BerkeleyソケットとCを使用します。例を読んで調べた後、単一の変数を送信するだけの例しか見つかりません。
何をするのが普通ですか?各変数(名前とスコア)を別々のwrite()関数で送信しますか、それとも両方の変数を保持する構造体を作成しますか?
Beejのネットワークプログラミングガイドを読んだ後、考慮しなければならないバイト順序(ビッグ/リトルエンディアン)の問題に遭遇しました。これはセクション7.4シリアル化-データのパック方法に示されていますが、それ以外は問題ありません。すべてのサンプルコードパッケージで、それらはフロートし、単一の変数ですが、構造体全体をパックする方法はありますか?
クライアントとサーバーがどのように通信するかを説明するプロトコルの作成について説明するセクション7.5Soneof Data Encapsulationもあります。私にとって、これは構造体と私がやらないことのように見えますが、原則を示すコードはありません。
つまり、サーバーとクライアントの間に安定した通信を作成し、単一の変数以上のものを交換したいと考えています。