問題タブ [sendto]
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++ - sendto() を使用して構造体を送信する方法
私は構造を作成しました:
sendto メソッドを使用してこの構造体を送信するには、構造体を型キャストして、以下のように送り返します。
しかし、構造体をキャストしているときにchar*
、実際のデータの値が失われ、デバッグ中に sendbuf に他の値が含まれていることがわかります。
sendtoを使用して上記の構造を送信する方法を教えてください。
c - Linux で C を使用すると raw ソケット sendto が失敗する
コードで作成した IP ヘッダーと UDP ヘッダーを使用して、UDP を使用して生のパケットを送信しようとしています。raw パケットは で正常に初期化されsocket(PF_INET, SOCK_RAW, IPPROTO_UDP)
、 を使用してソケット オプションが設定されsetsockopt(sd, IPPROTO_IP, IP_HDRINCL, val, sizeof(int))
ました。
問題は、 を使用してパケットを送信するとsendto()
、「メッセージが長すぎます」というエラーが表示されることです。
IP ヘッダーは 20 バイト、UDP ヘッダーは 8 バイト、データは 12 バイトです。したがって、合計はわずか 40 バイトです。これは、単一の UDP パケットに対して長すぎることはありません。誰か助けてくれませんか?
の型val
はへのポインタですint
これが私のコードです:
sockets - sendto が VxWorks で機能しない
以前にこの質問をしましたが、解決策がありませんでした (まだ問題があります)。関数がエラーなしで返され、データが送信されなかったため、困惑しています! このコードは Linux で動作します... VxWorks バージョンは動作しません (sendto は送信しませんが、エラーなしで返されます)。
概要 - 私は単純なエコー サーバーを書いています - サーバーは (x86 ボックスから) データを正常に受信し、正常に送信したと主張します。ただし、クライアント (x86 上の netcat) ではデータが受信されません。このコードは、PowerPC ボックスの VxWorks 5.4 で実行されています...
UDP データは何らかの方法でバッファリングされていますか?
別のタスクが sendto の送信を妨げている可能性はありますか? (ここで暴走するつもりはありませんが、通常の優先度でアプリケーションをタスク生成します。つまり、ネットワーク タスクなどのような重要なタスクの下にあるため、これで問題ありません)。
VxWorks が UDP データをバッファリングしている可能性はありますか?
ルーティング テーブルをセットアップしました ... ping が機能します。
私の知る限り、ファイアウォールはありません...
sendto のニュアンスと、データがクライアントに到達するのを妨げるものは何ですか...
c - ソケットプログラミング:sendtoは常にerrno 22(EINVAL)で失敗します
このコードでは、エラー番号が22(EINVAL、無効な引数)で、常にバイトが送信されていません。は他のdestination_host
場所に設定されており、有効であることがわかっているので、実際に何が起こっているのかわかりません。 MAXMSGSIZE
は1000です。エラーや警告はありません。私はコンパイルしています-Wall -Werror -pedantic
network-programming - udp 受信遅延の原因は何ですか?
UDP ソケットから等間隔でパケットを送信すると、最初に送信されたパケットが遅延しているように見えることに気付きました。たとえば、パケットを 100 ミリ秒ごとに送信している場合、パケットを受信する間の遅延は、ネットワーク上で平均 100 ミリ秒、平均標準偏差 4 で正規分布することがわかります。ただし、最初のパケットと 2 番目のパケットの受信時間のギャップは、通常 10 ~ 40 ミリ秒程度です。ご覧のとおり、これは明らかに統計的に有意な差です。私の質問は、何が原因でしょうか?
Linux で C の sendto 関数を使用しています。宛先IPがMACアドレスに変換されるまでパケットが送信されないようにするARP解決が遅延の原因である可能性があると誰かが示唆しました-これは可能性が高いですか? 送信プログラムを再起動すると、最初のパケットに再び時間がかかりすぎて、遅延に一貫性がなくなります.10から40ミリ秒はかなり大きな範囲です.
この最初のパケットに時間がかかりすぎる理由と、それを回避する方法を見つける必要があります。
編集: pcap を使用してさらに分析すると、送信プログラムが適切な間隔でパケットを送信していることが示されます。select() を使用して読み取り可能なソケットを待機し、recvfrom を呼び出してパケットを出力している受信側に問題があるはずです。私が知らないかもしれない何らかのバッファリングが行われていますか?
sockets - sendto() の呼び出しと送信側のネットワーク カードの間で、発信者に通知せずにメッセージが消えてしまうことはありますか?
sendto() でデータグラム (6740 バイト) を同じ LAN 上の別のホストに送信します。多くの場合、問題はなく、他のホストがデータグラムを受け取りました。しかし、時々データグラムが消え、ローカルネットワークインターフェースに到達しません。これはwiresharkで見たことがあります。しかし、sendto() 関数は問題を示しません (つまり、-1 を返します)。それは 6740 を返します。私も strace で調べましたが、すべて問題ないようです。私はubuntu 10.04と通常のc関数を使用していますsendto()
(ただしACEライブラリ経由)。これをさらに調査するにはどうすればよいですか?主な問題はおそらく次のとおりです: sendto() の呼び出しと送信側のネットワーク カードの間で、呼び出し元に通知せずにメッセージが消えてしまうことはありますか?
c - C sendto は時々動作します...しばらくすると停止します...エラーはありません
C の sendto 関数で奇妙な結果が得られました (LINUX) 私がやろうとしているのは、信頼できる UDP のようなスキームを実装することです。
以下に示すコード スニペットは、パケットがドロップされたときに期限切れになるタイマーの一部であり、そのパケットを再送信するためにプロセスにメッセージを送信します。
私が抱えている奇妙な問題は、大きなファイルを転送するときに...> 300KB以下のコードは完全に機能します(つまり、ELSE部分が実行されます)しかし、特定の数のパケットが送信された後...それを実行します部。!!!
コードが約 250 パケットで正常に機能したが、251 パケットで正常に機能したため、これは奇妙です。
助けてください!!!!前もって感謝します
c - sendto : リソースが一時的に利用できません (errno 11)
sendto に問題があります。
recvfrom で UPD パケットを受信し、sendto を使用して送信者に返信する受信者がいます。
残念ながら、errno 11 (リソースが一時的に利用できません) が表示されます。ソケットを2つ使用しています。
最初のパケットは実際に送信されますが、その後のパケットは送信されません:
sendto :: 成功
エラー: 0。
sendto :: リソースが一時的に利用できません
エラー: 11.
sendto :: リソースが一時的に利用できません
...
これは私のコードの抜粋です:
そして、SIGIO ハンドラーで:
この問題は、ポートがまだホットで、再利用する前に待つ必要があるために発生する可能性がありますか? ポートを変更しようとしましたが、役に立ちませんでした。
更新: sleep(1) がコメントアウトされている場合、パケットは実際に送信されます!
どうもありがとうございました。
linux - Linuxマルチキャストsendto()のパフォーマンスは、ローカルリスナーによって低下します
マルチキャストを使用してデータを送信する「パブリッシャー」アプリケーションがあります。このアプリケーションはパフォーマンスに非常に敏感です(マイクロ秒レベルで最適化しています)。この公開されたデータをリッスンするアプリケーションは、公開アプリケーションと同じマシン上にある可能性があります(多くの場合、そうです)。
最近、興味深い現象に気づきました。sendto()を実行する時間は、マシン上のリスナーの数に比例して増加します。
たとえば、リスナーがいない場合、sendto()呼び出しの基本時間は5マイクロ秒であるとします。リスナーを追加するたびに、sendto()呼び出しの時間が約2マイクロ秒増加します。したがって、リスナーが10個ある場合、sendto()呼び出しには2 * 10 + 5=25マイクロ秒かかります。
これは、データがすべてのリスナーにコピーされるまで、sendto()呼び出しがブロックされることを示唆しています。
リスニング側の分析もこれをサポートします。リスナーが10人いる場合、各リスナーは前のリスナーより2マイクロ秒遅れてデータを受信します。(つまり、最初のリスナーは約5マイクロ秒でデータを取得し、最後のリスナーは約23〜25マイクロ秒でデータを取得します。)
プログラムレベルまたはシステムレベルで、この動作を変更する方法はありますか?非ブロッキング/非同期のsendto()呼び出しのようなものですか?または、少なくともメッセージがカーネルのメモリにコピーされるまでブロックするだけで、すべてのリスナーを待たずにメッセージを返すことができます)?
c# - ループ内のC#Socket.SendToは、最終的にSocketExceptionを引き起こします(ルーターによって異なります)
私はいくつかの基本的なソケットメッセージングを行っています。うまく機能するルーチンがありますが、負荷がかかっていると問題が発生します。
私はUDPを使用してコネクションレス型のSendToを実行し、基本的にpingのような操作を実行して、LAN上にリスナーが存在するかどうかを確認しています。理想的にはブロードキャストアドレスを使用するだけですが、ワイヤレスルーターは私のブロードキャストを中継していないようです。私の回避策は、サブネット上のすべてのIPを反復処理し、データグラムを各IPに送信することです。他のPCはリッスンしていて、メッセージを受け取った場合は返信します。これにより、ピアはお互いを見つけることができます。サブネット内の各IPにデータグラムを送信するループ内のコードは次のとおりです。
これは機能しますが、サブネット範囲が大きい場合、たとえば255.255.0.0(反復するIPが最大60,000)の場合、最終的にエラーコード「10022」で「無効な引数」を意味するSocketExceptionが発生します。これは、送信が約10,000回成功した後に発生する傾向があり、このエラーが発生し始めます。また、私が職場で使用しているルーターはそれを処理し、おそらく高出力ルーターですが、私のラボの安価なルーターがエラーを発生させます。
SocketExceptionをキャッチした後、ループを再開する前に待機時間を置くと、通常は回復しますが、最終的には再びエラーが発生します。
ルーターのバッファーがいっぱいになり、データを送信できなくなったことが原因だと思います。仕事でより高品質のものはそれを処理することができますが、安価なものは行き詰まります。それはもっともらしいと思いますか?
いくつかの質問:
1)コネクションレス型の方法でSendToを使用する場合、ソケットでClose()を呼び出す必要がありますか?
Close()を呼び出すことによる利点は見られませんでしたが、Close()を呼び出すと、反復が大幅に遅くなります(速度が大幅に低下するため、上記でコメントアウトしています)。これは意味がありますか?
2)さらにデータを送信する前に待つ必要があることを通知する方法はありますか?例外をキャッチするのは正しくないようですが、その原因はまだわかりません。
ありがとう、J。