• 締切済み

UDP受信時の通信異常検知について

foneraの回答

  • fonera
  • ベストアンサー率52% (38/72)
回答No.3

恐れ入ります。ANo.2で回答した者です。 まず最初に、もしかしたら他に方法が有るかも知れない(私自身が無知である)可能性があるとお断りしておきます。(純粋に、自身の経験からのアドバイスになります) >UDPマルチキャスト受信中にLANケーブルが日常的に抜かれることを想定しているのですが、 基本的にUDPを使うべきではありません。通信にはTCPを使うべきです。 ただし、ブロードキャストやマルチキャストはUDPでしか使えないので、しょうがなくUDPを使います。 その為、日常的にLANケーブルが抜かれる環境下では、マルチキャストもしくはユニキャストでIPを集めてから、TCP(ユニキャスト)で接続し直すべきかと思います。 >ためしに抜き差ししたところ、一回抜くと、再度挿してもUDPを受信しなくなってしまいました。 >(recvfrom()はずっと待ち合わせている状態) >recvfrom()はずっと待ち合わせているのに、なぜUDPは受信しなくなるのか、その原因を追究しております。 こちらで簡単なサーバクライアントを書いて実験したところ、再接続後に問題なく受信しました。(WindowsのWinsock2を使用) その為、実装や環境によって違うと思います。 おそらくですが、NICの反応が無くなることでソケットが壊れる(ディスクリプタが使えなくなる)のだと思います。 現象が再現できないため推測になりますが… お使いのrecvfrom()が一般的であれば、1つ目の引数でディスクリプタを渡すと思います。ソケットが壊れていれば、その時点でエラーが返ってくるはずです。(recvfromで待てない) エラーが帰ってきた場合は、再度ソケットを作成し直す(recvfromで待てたときはそのまま待つ)という実装で良いかと思います。 ご参考になれば幸いです。

関連するQ&A

  • WinsockAPIのrecvfromの受信データがおかしい

    環境は WinXPSP2、VB6SP6です WinsockAPIでUDPのマルチキャスト通信で 定期的にrecvfromでデータを受信しています サーバの配信が止まってる時に recvfromをすると、以前に受信したデータが残っており 同じデータを受信し続けます、返り値はゼロではないです Cならばrecvfromの返り値にゼロが入るのですが・・・ どうすれば受信が終わった(正しく受信できない)ことを判ることができるでしょうか?

  • UDP通信での受信方法について

    MFCでUDPプロトコルを使ったサーバー・クライアントをソケットプログラムで書いております。 ソフトの内容は、クライアントから送信されたの文字列のコマンドをサーバで処理をするだけです。 サーバー側での受信の仕方は WSAAsyncSelect()関数を使ってソケットイベントが発生するごとに親ウィンドウに自作のメッセージ(WM_MY_MSG)が送られるように設定する ↓ WM_MY_MSGのメッセージハンドラ内でrecvfrom()関数を使って受信する。 という方法を用いています。クライアント2台ぐらいであれば正常に動きます。 質問1: まだ試したことはないのですが(というより試す環境がない)、ほぼ同時ぐらいに複数(10台ぐらい)のクライアントからコマンドが送信された場合、それを全部正確に受信できるものなのでしょうか?要するに一つのコマンドを処理中に別のコマンドが送られてきた場合の動作はどうなるのでしょうか? 質問2: UDP通信での受信をする場合の何かもっとスタンダードな方法があるのでしょうか? よろしくお願いします。

  • UDPのマルチキャストについて。

    趣味でネットワークゲームを作成しているのですが、質問があります。 リアルタイム性が強く比較的失われても構わない情報をUDP通信にてLinuxサーバーから複数のクライントに送信しています。 今回、このようなケースの場合マルチキャストを利用するとネットワーク負担が減るのではないか?と考えました。 そこで調べてみたのですが、サンプルがどれも同一ネットワーク内のものばかりです。 動画配信などで利用されているという記事を見たのでできると考えているのですが、実際問題どうなのでしょうか? またルーターを超える場合はルーターが対応していなければならないと知りました。 知りたい内容は以下です。 ・一般家庭にあるルーターはマルチキャストに対応しているのかどうか? ・そもそものマルチキャストの考え方はあっているのか? ・もし対応していないルーターがあった場合このようなシステムを利用しているプログラムはどうしているのか? 用語を知ったばかりで的を外れた質問をしていたらすいません。 自分でも調べてみますが、参考URLや用語などをいただけると大変助かります。 よろしくお願いいたします。

  • UDPの送信確認

    こんにちは。 現在、UDP通信でネットワーク上の別PCからデータ受信をしているのですが、偶に相手からデータが送られてきた後、こちらからACKを返さない時があります。 UDP通信なので相手にきちんとACKが届いたかの確認は出来ないかと思うのですが、こちらがACKを送ったかどうか確認出来るような関数?API?はないのでしょうか? もしあるようでしたらご教授お願いします。

  • UDP通信におけるbind関数について

    初めて質問させていただきます。よろしくお願いします。 最近、ネットワークプログラミングの勉強をしているのですが、bindについてよくわからなくなってきました・・・。よろしければご教授願います。 質問内容は以下の通りです。 (1)bindにおける設定内容は、「相手側のIPとポート番号」なのか「自分側のIPとポート番号」なのか?  色々なところを調べてみましたが、「IPとポート番号」を設定する、としかかかれてなく、いったいどっちなのかがわからなくなってきました・・・。 (2)UDP通信において、bindは必要なのか?  サーバ-クライアントの関係が曖昧なUDP通信において、bindというのは必要なのでしょうか。 私の認識では例えば、「recv関数」などを使い受信待ちをする場合はbindが必要だが、送信だけの場合には不要であるとなっています。 この認識はあっているのでしょうか。 拙文ですが、どうか教えていただきたく <(_ _*)>

  • ネットワーク障害を検知してくれるハブについて

    先日、社内LANにてウィルス感染のためにネットワークがダウンしてしまう現象が発生してしまいました。原因としては、PCがパケットを大量送信してしまうことによって、ネットワーク全体のトラフィックが多くなり、しばらくすると全く通信できない状態にまでなってしまったのですが、この出来事を受けて、ネットワーク管理のあり方を見直すことになりました。 そこでまず、ハード面の対策として、ハブについては現行の単純なスイッチングハブではなく、ネットワーク障害が発生した時に、障害が発生したことを検知して、できれば管理者に通知してくれるようなものに買い替えたいと思っています。 オススメの機器があれば、ぜひ教えて下さい。 また、そのような機器を探すにあたり、どのようなキーワードで探せばいいか、あるいは選定にあたっての留意事項なども教えていただけると助かります。 以上、よろしくお願いいたします。

  • ネットワーク通信

    お世話になります、海苔通と申します。 ネットワーク通信で困っていることがあります。どなたか、御教授頂ければ幸いです。 2装置間でudpパケットの通信を行っているのですが、 まれにudpパケットが過去に送ったudpパケットとなるときがあります。 mirrorポートを仕込んで現象発生時のパケットをLANアナライザ(イーサリアル)で見たのですが、そのパケットにトレイラーとFCSなるものが付加されていることがわかりました。 質問1 そこで質問なのですが、これらの付加情報を取得することは可能なのでしょうか?(もし、これらの付加情報を取得できるのであれば、エラー処理が可能ですので。。。) 質問2 また、これらの付加情報が付く原因は何が考えられるでしょうか? 以上、宜しくお願いします。

  • 宛て先の特定の為の手段

    『リンクローカルさえもさえも』と『プライベートスコープ』と『グローバルスコープ』との3種類に、マルチキャストアドレスが分類され得る、 という事情を最近に初めて私は知りました。 但し、残念乍ら、格好悪いことに、 マルチキャスト通信で『宛先の全端末群へ同時にデータが送られるのか、 それとも、『中継者のルータだけに送られた後に、 其処から配下の全ホスト群へ配信されているのか』、 或いは更に別の手段が採用されているのかさえもが全く私には分かりませんから、 畏れ入りますが、マルチキャストの仕組みにつきましての御教授を賜れませんでしょうか?

  • JavaからC構造体にパケット通信する方法

    ネットワークプログラミングの初心者です。 現行のシステムがC言語で実装されているUDP送受信アプリに対して、 この度、Javaクライアントでも連携をおこなうことになりました。 しかし、現行のシステムはクライアントとサーバ間でC構造体をUDPにて送受信しています。 JavaでC構造体と同様のデータを作成しUDP送信、またサーバからUDP受信したデータをJavaで使用できる型変換する方法はありますでしょうか。 JNIやJNAを使用しない方法で、ご教授いただけますでしょうか。 以下にC構造体の例を記載いたします。 typedef struct udp_data { long b_type; long a_type; char userid[128]; char passward[128]; } UDP_DATA;

    • ベストアンサー
    • Java
  • Winsockコントロールを使用してマルチキャスト通信

    まずは環境を WindowsXPSP2、VisualBasic6.0SP6です。 目的はサーバがマルチキャスト配信しているのを VBのクライアントがWinsockコントロールを使用して受信する方法を教えていただきたいのです。 Winsockコントロールを使用してUDPでの通信ができたのですが WinsockコントロールにはCの「setsockopt」に該当する命令が無い(わからない)のです。 Winsockコントロールで実現できないのであれば winsockのAPIを使用する方法でもかまわないのですが APIの情報も見つからず困っています。 APIを実装しても「IPPROTO_IP」「IP_ADD_MEMBERSHIP」などの定数の定義の情報がなくわからないのです。 これらの情報が載っているページや、解説しているページがあればお教えください。 または実装方法を知っておられるならお教えください。 よろしくお願いします。