• ベストアンサー

C言語のsocket関数で、複数NIC実装PCはどうなるのでしょうか?

UNIX-C言語で、TCP/IP通信を勉強していて、疑問にぶつかったのですが、 複数のNIC(もしくはIPアドレス)を実装しているPCは、 自分のIPアドレス(gethostby***関数などで)を取得したばあい、 どのように見えるのでしょう? また、そのPCがC/S構成におけるserver側だった場合、 bind()関数に設定するIPアドレスはデータ通信したい側のNICの IPアドレス一つでいいのでしょうか。 NIC2枚挿しのPCが身近にないので、実験できません(^^;) どなたかご教授いただけませんでしょうか m(_ _)m

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

  • ベストアンサー
  • toysmith
  • ベストアンサー率37% (570/1525)
回答No.1

1. gethostby****関数は複数のIPアドレスを報告します。 NIC複数挿し、クラスタリングによる複数IPの可能性がありますが、クライアントとしてはそれらを区別する必要はありません。 struct hostentのh_addrlistは複数IPアドレスに対応してchar **となっています。 2.bindには「全てのNIC」というオプションがあります。 struct in_addrを設定する時にIPアドレスとしてINADDR_ANYを設定すれば全てのNICに対してbindされます。

mijuku
質問者

お礼

詳細な説明ありがとうございました。 きちんとした意味をしらずに、gethostby****や、bindなどの関数を 使用していたのだな、と思い知りました(^^;) まだ、知らなずに使っていることも多々あると思いますが、 できるだけ不明点を残さずに、事にあたろうと思います。 これだけ頼りになる皆様がいるのですから(^^)

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 1つのNICに複数のIPアドレスを割り当て

    わけあって、1つのNICに2つの固定IPアドレスを割り振ったノートPCがあるのですが、 このノートをたまにDHCP環境に持って行って作業することがあります。 いちいち設定を変えるのが面倒なので、さらにDHCPの設定を追加したいのですが どうやればいいのかわかりません。(^^;;; 要は、固定IP+固定IP+DHCPってのを、1つのNICに割り当てたいのです。 昔、誰かがNICの下にTCP/IPプロトコルを複数ぶら下げてバインドしてたような気がした のですが、いざやってみると1つのTCP/IPプロトコルしかぶら下げられません。(T_T) どなたか知っている方がいたら教えてください。m(__)m 「netshでバッチ組めば、とか、切り替えソフト使えば」ってのはなしで。 これが面倒・忘れる・時間がかかるので…(^^ゞ

  • socketでの複数NICの扱い

    socketを使ってUDPのプログラムの勉強をしているのですが、マシンに複数のネットワークカードが搭載されていて複数のIPアドレスを持っている場合、sendto()でどのNICから送信するかを指定できないものなんでしょうか よろしくお願いいたします。

  • NIC2枚とPC3台で別セグメントネットワーク

    ネットワーク初心者です、困っています。 LANアダプタを使って、Windows7のマシンをNIC2枚にしました。 このPCをつかって、以下のような完全に閉じたネットワークを作成したいです。 【構築したいネットワーク構成】 [Win7 (1)]--[スイッチングハブ]--[Win7 (2)]--[スイッチングハブ]--[Win7 (3)] ここでは以下のような前提条件があります。 【前提条件】 ・(1)、(3)のIPアドレスは固定で、別セグメントです。  仮に以下と定義します。 (1) IPアドレス :192.168.0.11 サブネットマスク:255.255.255.0 (3) IPアドレス :192.168.1.11 サブネットマスク:255.255.255.0 ・ルータは用意できません。 【自分でやってみたこと】 ネットワークの知識が乏しいので、見当違いのことをしている可能性があります 1)上記でしめしたように接続して、(2)マシンでNIC2枚を選択して、ブリッジ接続を有効にしました。   (1)→(3)、(3)→(1)のpingが通りませんでした。 2)ブリッジ接続を無効にし、以下のとおりネットワークアドレスを変更しました。 (1)のNIC  IPアドレス :192.168.0.11 サブネットマスク:255.255.255.0 デフォルトゲートウェイ192.168.0.10 (2)の(1)側のNIC  IPアドレス :192.168.0.10 サブネットマスク:255.255.255.0 デフォルトゲートウェイ192.168.0.10 (2)の(3)側のNIC  IPアドレス :192.168.1.10 サブネットマスク:255.255.255.0 デフォルトゲートウェイ192.168.1.10 (3)のNIC  IPアドレス :192.168.1.11 サブネットマスク:255.255.255.0 デフォルトゲートウェイ192.168.1.10   route -p addコマンドで、以下の固定ルートを追加 (1)から(2)の(1)側のNICのIP向け (1)から(2)の(3)側のNICのIP向け (2)の(1)側から(3)のNICのIP向け (2)の(1)側から(1)のNICのIP向け (3)から(2)の(1)側のNICのIP向け (3)から(2)の(3)側のNICのIP向け (2)の(3)側から(3)のNICのIP向け (2)の(3)側から(1)のNICのIP向け (1)→(3)に対してpingを通したいのですが、そもそも(1)からだと、(2)の(1)側のNICまでしか通りません。 どのような設定をすれば、ルータなしでセグメントが違う2台のネットワークを接続できるでしょうか? そもそもなぜこんなことを、と思われるかもしれませんが、どうしてもこの完全クローズのローカルネットワークをつくらねばなりません。 有識者の方、ぜひ力をお貸しください。

  • C言語でチャットプログラミングを・・・

    C言語(unix環境)でチャットプログラミングを作りたいのですが、まずは、TCP/IPによるマルチクライアントで簡単なメッセージのやりとりができるプログラムを練習として作りたいと考えています。 そこでサーバにクライアントからメッセージが届いた時点で全クライアントにメッセージを送信(write)し、逐次更新されるようにしたいのですが、クライアント側で常にread関数を呼び出すのは非常に不格好だし、メッセージを入力するといった他の処理ができなくなると思うのです。 何か方法はありますでしょうか? なにぶんネットワークプログラミングは始めたばかりですので初心者向けの解説をお願いします。

  • FortranプログラムからC言語で実装された関数を呼ぶには?

    Windows Vista Home PremiumにFTN95をインストールしたPCにて、Fortranのプログラミングをし始め、「Cpad for Salford FTN77」を利用してプログラミングをしています(FORTRAN77・Fortran90ともに)。FTN95でのFortranプログラミングに際し、FortranプログラムからC言語で実装された関数を呼ぶには、どのように対処すれば可能になりますでしょうか? ユーザーガイドによれば、「Fortranプログラム中に、C_EXTERNALという宣言をした関数は、Cの関数と同じくアクセスできるようになり、C側では、#extern <返り値>関数名(引数)を与えれば、Cの関数として呼び込むことができる。」とのことがかかれています。 実際に使っているファイルをいくつか書き出します。 <D:\fortran\sample.f> C_EXTERNAL WRITE 'WriteFile' : INTEGER*4 INTEGER*4 RESULT RESULT=WRITE() write(*,*) result return end <D:\fortran\sample.c> #extern int Writefile(int); <C:\Program Files\Silverfrost\FTN95\ftn95c.bat> ftn95.exe %1 %2 %3 %4 %5 %6 %7 %8 %9 /link ちなみに、「Cpad for Salford FTN77」での実行/設定/実行/コンパイル時のパラメータは「/link /dreal」です。もちろんftn95.exeへのパスは通してあります。何が問題でしょうか? 何分初心者ですので、拙い質問かと思いますが、何卒ご教示願います。

  • FortranプログラムからC言語で実装された関数を呼ぶ方法

    Windows Vista Home PremiumにFTN95をインストールしたPCにて、Fortranのプログラミングをし始め、「Cpad for Salford FTN77」を利用してプログラミングをしています(FORTRAN77・Fortran90ともに)。FTN95でのFortranプログラミングに際し、FortranプログラムからC言語で実装された関数を呼ぶには、どのように対処すれば可能になりますでしょうか?何分初心者ですので、拙い質問かと思いますが、何卒ご教示願います。

  • C言語の高階関数についてです。

    C言語の高階関数についてです。 double f ( (*g)(double) ){...} とすると「関数を引数にする関数」が作れますが、 「関数を引数にする関数」を引数にする関数って作れますか??? その場合は、引数のところどうやって書けばいいでしょうか??

  • winsockにて複数NIC環境でのBC送受信

    複数のNICが刺さっている環境で、UDPを利用したブロードキャスト送信(受信)についての疑問です。 パソコンAとBがあり パソコンAには1つのNIC(192.168.1.1) パソコンBには2つのNIC(192.168.2.2 と 192.168.3.3) ※それぞれサブネットマスクは 255.255.255.0 が同じネットワーク内に存在し、それぞれ INADDR_ANY を指定して bind されていたとします。 パソコンAから INADDR_BROADCAST を指定して snedto した場合、パソコンBの 192.168.2.2 と 192.168.3.3 の両方に同じパケットが届くのは正常な処理だと思うのですが、パソコンBから同じように snedto をすると、パソコンA には 192.168.2.2(メトリック値が低い方のアドレス) からのパケットしか届きません。 複数のNICがある場合に INADDR_BROADCAST を指定してパケットを送信すると、それぞれのNICから同じパケットが送信されるものと認識していたので、192.168.1.1 には 192.168.2.2 と 192.168.3.3 の両方から同じパケットが届くものかと思っていたのですが、優先NICからのみ届くというのが正常な動作なのでしょうか? もしそうであるのならば、1つのIPアドレスから同じパケットが複数届く場合の処理(自分のパソコンが複数NICの場合の処理)は必要になりますが、違うIPアドレスから同じパケットが届くケース(相手のパソコンが複数NICかどうか)は考えなくても良いということでしょうか? ご存知の方がいらっしゃいましたらご教示いただけると幸いです。

  • C言語でTCPの3way handshake

    (C言語)Linuxのpacket socket(socket(AF?PACKET, SOCK_DGRAM, htons(ETH_P_IP))) を使ってTCPの3way handshakeをOSのプロトコルスタックに頼らず自力で挑戦しています。 RFCやほかの技術本をよんでIPヘッダやTCPヘッダの実装は一応できたのですが、肝心のsynパケットを送った後のackパケットが返ってきません。 wiresharkでは問題なくsynパケットと認識できているのですが、きっとどこかに不備があるはずです。 そこでC, C++ Javaでもいいのでこのプログラムの実装例が載っているサイトなどを教えてください。(英語でもかまいません)

  • 同じIPアドレスの機器をPCへ複数台接続

    一台のPCに複数のネットワーク機器を接続して、 通信テストを行おうとしています。 機器は全て同じIPアドレスを持っています。 (このIPアドレスは変更できません) PCにNICを複数枚搭載して、それぞれに一台 づつ接続してもOKなのでしょうか?(IPアド レスが同じでもNICが違えば大丈夫?) または、XPortなどのLAN-232C変換機を使って シリアルポート経由で接続すればIPアドレス は重複していても大丈夫なような気がしますが いかがなものでしょうか。 アドバイスをお願いします。

新しいPCでの設定方法
このQ&Aのポイント
  • PCを買い換えたので新しいPCでの設定方法について教えてください。
  • PCを買い換えましたが、詳細な設定ができない問題が発生しています。新しいソフトウェアのダウンロードが必要ですか?
  • お使いのPCのOSはWindows10です。接続は無線LANです。関連するソフトウェアはoffice CDレーベル印刷です。回線の種類は光回線です。
回答を見る

専門家に質問してみよう