• ベストアンサー

C# ソケット通信で相手に送信できるか事前にチェックする方法

C# ソケット通信で相手に送信できるか事前にチェックする方法 いつもお世話になっております。 チャットのようなプログラムを作ろうと思い、ソケット通信のやり方を勉強しているのですが、どうしてもできないことがあります。 IPアドレスとポートを指定して、その相手先と通信できるかどうかをタイムアウト以外で知る方法です。 また、今回はサーバーを立てずに同じLAN内であればやり取りできるようにしたいと思っています。 できればLAN内の端末すべてに送信といったこともしたいのですが、TCPではできないのでしょうか。 分かる方がいましたらお願いします。

  • tasoh
  • お礼率87% (65/74)

質問者が選んだベストアンサー

  • ベストアンサー
  • nda23
  • ベストアンサー率54% (777/1415)
回答No.1

>タイムアウト以外で知る方法 あっても無駄です。 何故かと言うと、調べた時OKでも、次の瞬間NGに なる可能性があるからです。結局はタイムアウトに なります。そうであるなら調べるだけムダでしょ。 だから無いのですよ。 通信に限らず、ネットワークだとか多重プロセスの 下でのプログラムでは「事前調査」を行う意味は 殆どありません。 >LAN内の端末すべてに送信 1ヶ所ずつ送信します。 LANに繋いでいるマシンの取得は幾つか方法があり ますが、VB.NETの例は下記を参照してください。 C#でも同じオブジェクトが使えます。 http://okwave.jp/qa/q6060499.html これも、調べた時と実際に送信する時で条件が変化 する可能性があります。何時、シャットダウしたり、 立ち上げるか分かりませんからね。

tasoh
質問者

お礼

回答ありがとうございます。 なるほど、確かにその通りです・・・ ログイン状態とかをチェックしたかったのですが UDPで送るだけ送っとく方法で対処することにします。 マシンの取得方法、参考にさせて頂きます。 ありがとうございました。

関連するQ&A

  • 【ソケット通信】TIME_WAITを0にする方法

    【現状】 VC#でソケット通信のソフトを作成しています。 【問題】 クライアント―サーバ型のソケット通信をしようとしているのですが、切断後すぐに再接続できないという問題が生じております。 【調査結果】 調べたところ、TCP/IPの状態遷移でアクティブクローズ側がTIME_WAIT状態になることが分かっています。TIME_WAITの設定値には意味合いがあり、漂流中の重複パケットの問題を回避するためや最後のACK再送のためであることは理解しております。 【やりたいこと】 今回は基本的に1:1通信でルータを挟まずにやりとりするネットワークなので、TIME_WAITを0、もしくは数msecにしたいと考えています。 ※ 同じIPアドレス、ポート番号で接続したい為(ポート固定での再接続) 【自分で出した解決案の一つ】 どうもサーバ(Listenする側)からアクティブクローズすると、TIME_WAITは生じるもののクライアントから接続要求を出すと同じポートからでももう一度接続できてしまうというのは判明したので、必ずサーバから切断要求を出す仕様にすればTIME_WAITが0になるように思われます。 ただし、なぜ再接続できるのかは不明のため、すっきりしない(&環境や設定が異なると再接続できない可能性あり) 【質問】 (1) クライアント側からアクティブクローズする場合に、TIME_WAIT状態を1秒未満に設定する方法はありますか?(VC#で) (2) サーバからアクティブクローズした場合に、なぜ再接続できてしまうのでしょうか? 以上の2点の質問に、どうかご回答のほどよろしくお願いいたします。

  • TCP/IP通信(ソケット通信)について

    開発者新人です。 この度、TCP/IPのソケット通信を使ったWindowsアプリケーション開発(クライアント/サーバ)を 行います。 過去にシリアル通信の開発経験はありますが、ソケット通信の開発は初めてです。 そこでSEの皆さんにぜひご教示頂きたいのですが、設計をする上での 標準的な設計事等あると思いますが、どういう観点にて設計していきますでしょうか。 また、ソケット通信を行う際、コマンドフォーマットを決めるかと思います。 用途に応じて様々かも知れませんが、標準的なフォーマットはどういうものでしょうか。 (例) コマンドID、サイズ、データ部、サム。 シリアル通信のようにSEX、ETX等のヘッダは必要? 再送、タイムアウトの考え方等々。 変な質問内容になりましたが、宜しくお願いします。

  • C++ ソケット LAN2つ

    C++でソケット通信のプログラムを作成中で、アプリを動かすPCにはLANが 2つ付いていて片方をアプリ用、もう片方を別用途で使用しようとしています。 ここで質問ですが、アプリ側でどちらのLANを使用するか指定することってできるんでしょうか? それとも指定する必要ないんでしょうか? ソケットプログラムを作成する上では送信先のIPを指定したり、INADDR_ANYで受信したり、相手先の設定はあるのですが、自分のIPを指定するような設定が無いように思えます。 クライアントプログラムとしてはLANが2つあっても意識する必要はないのでしょうか?

  • Javaのソケット通信について初歩的な質問です

    私はいま、独学でJava言語の勉強をしています。 おそらく初歩的な質問ですが、いくら検索をしても見つからなかったため、質問させていただきます。 JavaでTCPを使ってソケット通信をする際の質問です。 WiFiのアクセスポイントAとアクセスポイントBがあるとします。 クライアントのアプリケーションが、アクセスポイントAからインターネットに接続し、サーバのIPアドレスとポート番号を使ってソケットを作り、サーバとTCP通信をしているとします。 このとき、クライアントが動いて、アクセスポイントBに接続したとします(接続が自動で切り替わる)。 このような場合でも、サーバとクライアントのコネクションは保っていられるのでしょうか? もしくは、このような場合でもコネクションを保つ方法はあるのでしょうか? よろしくお願いします。

    • ベストアンサー
    • Java
  • TCP/IPのソケット通信を使用して100ms毎にデータを送信するアプ

    TCP/IPのソケット通信を使用して100ms毎にデータを送信するアプリケーションがあります。 このアプリケーションをPC(Windows XP)上で実行すると、実際には200ms毎にデータを送信しています。 TCP/IPのNagle処理により200ms毎にデータを送信しているようです。 Nagle処理をOFFする為に、レジストリの HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/MSMQ/Parameters の下に TCPNoDelay REG_DWORD 0x00000001 を追加したのですが、状況が変わりません。200ms単位で送信してしまいます。 レジストリ変更後は、再起動を行っています。 他に設定する方法があるのでしょうか? 宜しくお願いします。

  • ソケット通信について

    VB.NET2005使用 PCと機器とをソケットクラスを使用してやり取りしています。 ここで、LANケーブルの切断やケーブルがコネクタから抜けたなど通信が途絶えた場合、再度接続する方法はありますか? もちろんケーブル交換、コネクタ確認を行った後です。

  • 通信方法を調べたいです。

    TCP/IP通信しているのか、NetBIOS通信しているのか調べる方法ありますか? NetBIOS通信という単語が適切かどうかは知識不足なため、分かりませんがTCP/IP通信をしているか調べる方法を探しています。 本で読んだところ、Windowsでは独自の通信方式があり、NetBIOS通信?というものでNetBIOS名を探して通信しているようなのです。 TCP/IPの勉強をしているので、通信はすべてTCP/IPで行ないたいのですが、現在NetBIOS通信を行っているのであれば、TCP/IPの通信に切り替える方法を探します。 知識不足なため、トンチンカンな質問しているかもしれませんが、現在の通信方式について調べたいので、調べる方法を知っている方がいらっしゃましたらよろしくお願いします。

  • ソケット通信について

    VC++6.0MFCでソケット通信のプログラムを作成しようとしています。勉強始めたばかりなので、やっと普通に通信するプログラムは理解できたところです。 そこで応用していろいろ考えているのですが、方法がわからないところがありますので教えていただければと思ってます。 サーバ側の接続待ちはいつでも受けれるようにして、接続してきたクライアントに対して送信したいと考えております。ソケットの接続情報を保持しておいて、別プロセスの送信プログラムが接続クライアントに対して送信したいと考えてます。その送信プログラムが複数ある場合も同じ接続情報を利用したいと考えてるのですが、可能でしょうか。 説明が下手で申し訳ありません。補足はいたしますので、アドバイスお願いいたします。

  • ノートンインターネットセキュリティ通信許可方法

    複合機からSMB送信をしたいんですがノートンインターネットセキュリティ2012でポートと複合機 の通信を遮断されています。 IPアドレスとTCP137、138、139ポートを許可したいんですが設定方法を教えて頂けないでしょうか?設定方法のサイトがありましたらお願いします。

  • TCP/IP通信でのコネクションロスト(ソケットエラー)の検知について

    インターネット上での対戦ゲームの作成を行なっているところです。 サーバーを挟んでクライアント間で双方向の通信を行なっています。  A → サーバー → B  A ← サーバー ← B TCP/IPは信頼性の高い通信方法ということで、データ抜けなどは 心配しなくても良いと聞いています。 もし、データ抜けなどが発生した場合はコネクションロストの状態になると。 実際のプログラミングではソケットを使用しています。 コネクションロストが起きると、ソケットエラーかソケットクローズで検知できます。 実際に例えばクライアントAを強制終了させるとサーバーはただちに ソケットクローズを検知します。 ここで、問題はデータを送っても届かないのに、 ソケットエラーもソケットクローズも起きない状態が発生することです。 これはインターネットの経路上になにか問題が発生したと考えていますが このような状態はタイムアウトなどで監視する以外に検知する方法はないのでしょうか? クライアントはウィンドウズでVB6.0のwinsockを、 サーバーはLinuxを使用しています。 なにかアドバイスをいただければありがたいです。

専門家に質問してみよう