• 締切済み

socketでの複数NICの扱い

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

みんなの回答

  • onosuke
  • ベストアンサー率67% (310/456)
回答No.2

随分と間があいちゃいましたね(^^;; >sendto()する前にbind()するという もう解決かと思いますが,そのとおりです。

  • onosuke
  • ベストアンサー率67% (310/456)
回答No.1

対象NICのIPアドレスでbind()してください。 (サーバプログラムの待ち受けアドレス制限と一緒) でも、普通は、IPルーティングされるのにまかせて垂れ流し。つまり、ルーティングテーブルの方で調整します。

f_attck
質問者

お礼

ご解答ありがとうございます。 送信の際にsendto()する前にbind()するという認識でよろしいのでしょうか よろしくお願い致します。

関連するQ&A

  • 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かどうか)は考えなくても良いということでしょうか? ご存知の方がいらっしゃいましたらご教示いただけると幸いです。

  • winsockで複数のLANカードを使用するには

    winsock初心者です。 TCPまたはUDPにて1枚のLANカードで通信するプログラムはよくあるのですが 複数のLANカードで通信する場合の参考プログラムがありません。 具体的には, UDPクライアントを作成する場合,指定したLANカード(IPアドレス)に生成したsocketとリンクして通信させたいのです。 bind()のsockname.sin_addr.s_addrにてINADDR_ANYではなくカードに設定したIPアドレスを設定すればよいのでしょうか? 同じ疑問がTCPクライアント作成でもあります。 この場合bind()ではなく,connect()で送信したいカードに接続されるサーバー側のIPアドレスを指定するということでしょうか? また2枚のカードを使用する場合,同じネットワークアドレス(192.168.0.XXX)は使用しない方が良いのでしょうか?(UDPブロードキャストだと両カードで送信してしまう?) 色々調べてますがこれだという回答がみつかりません 誰かご存知でしたら御教示願います。

  • SOCKETのUDPについて

    こんにちは。 SOCKETのUDPに使って通信をしようと思っています。 UDPは到達保証はされないとありますが、sendto関数で送信した内容のそのものも保証されないのでしょうか? sendto(sock, "HogeHoge", 8, 0, (struct sockaddr *)&addr, sizeof(addr)); とした場合、"HogeH"となったり"HHooggee"となったりするのでしょうか?

  • 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

  • Winsockでの送信(TCP)

    Winsockでの送受信プログラムを作成しています。 システム構成としてはサーバーが1つあって、それに複数のPC(クライアント)を接続します。 そしてチャットのようにやりとりを行うプログラムを作成しています。 しかし、チャットと違う点は、文字を、指定した相手(IPで指定)にのみ送信するということです。 自分で調べた結果UDPを用いれば簡単だということを知りました。(sendtoで送信先IPが指定できるから) しかし、TCPのほうが信頼性が高いということでTCPでやりたいと思いました。(勉強にもなるので) どなたかやり方をご教授お願いいたします。

  • Win2000サーバーで二枚目のNICに別セグメントのIP割当ができない

    ちょっと長くなります Windows2000 Serverがインストールされているマシン(Dell PowerEdge1300)にもう一枚NICをさして、ルーター兼Proxyにしようとして今実験中なのですが、どうもうまく行きません。 元々のNICは192.168.0.28のIPアドレスで192.168.0.0/24のネットワークにつなげて正常に使えています。 ここに新しくNICを追加し、ドライバーをインストールし、正常に認識ました。「ネットワークとダイアルアップ接続」の中に新しい接続が作成されています。 ここでこのNICに、例えば192.168.11.1というIPアドレスを割り当て、OKをクリックすると「今構成された静的IPアドレスは、すでにネットワーク上で使われています。」というダイアログが出て、コマンドプロンプトでipconfigとやっても0.0.0.0となってしまいます。 ちなみに、この新しいNICにはLANケーブルを接続していないので、IPアドレスの競合が起きるはずは無いのにです。 別のNICに変えても症状は同じでした。 更にわからないのは、新しいNICのIPアドレスを192.168.0.250のように、元々のNICと同じセグメントを指定すると、正常にIPアドレスが割り当てできるのです。 途方に暮れてしまいました・・・。 一体何が悪いのでしょう?

  • UDPについて

    SOCKETを使ってUDPの通信プログラムを勉強中なんですが sendto(),bind()ではstruct sockaddr_in型の構造体を渡しますよね。その中の sockaddr_in.sin_addr.s_addr はIPアドレス(コンピュータ名)をバイナリ化したデータですよね。これって、sendとreceiveそれぞれでどのような役割をしているのでしょうか。 また、sendto()はデータを送信しているんですよね。receive側ではreceiveする前にbindしなくちゃいけないみたいなんですが、そもそもbind()って何をしてるんでしょうか。 よろしくお願い致します。

  • NICを2枚挿したときのデフォルトNIC

    サーバに限ったことじゃないかもしれませんが・・・ サーバ(CentOS)にNICを2枚挿し、どちらも同じセグメントに繋いだ時、サーバからインターネットや、ルータやPC1に送信する場合はどちらのNICが優先的に使われるのでしょうか? NICを複数挿しした場合は必ずどのNICか1つをデフォルトNICとするような設定をしないとこのままでは通信できませんか? 調べていたらDEFROUTE=yesというのがあり、複数NICの場合は必ずそれをデフォルトNICに指定しないとダメなのかな?と思いまして。基本的なことですみません。 └ルーター(192.168.1.1)  ├PC1(192.168.1.2)  ├サーバ(eth0:192.168.1.100/eth1:192.168.1.200)   /etc/sysconfig/network-scripts/ifcfg-eth0 IPADDR=192.168.1.100 NETMASK=255.255.255.0 GATEWAY=192.168.1.1 DNS1=8.8.8.8 DNS2=8.8.4.4 /etc/sysconfig/network-scripts/ifcfg-eth1 IPADDR=192.168.1.200 NETMASK=255.255.255.0 GATEWAY=192.168.1.1 DNS1=8.8.8.8 DNS2=8.8.4.4

  • 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台のネットワークを接続できるでしょうか? そもそもなぜこんなことを、と思われるかもしれませんが、どうしてもこの完全クローズのローカルネットワークをつくらねばなりません。 有識者の方、ぜひ力をお貸しください。

  • 1台のNICに複数IP設定は速いか?

    今までWindowsServerとNAS(Linax)の2台で別々のIPを設定して運用していました。 WindowsServerには各システムを載せ、NASには共有するファイルを保存していました。 今回、高速なWindowsServerマシンと100GbpsのLAN(デュアルポートでチーミング設定)を導入することになり、10GbpsのNASを廃止し、WindowsServerマシンに統合しようと考えています。 そこで、1台のネットワークカード(NIC)に複数のIPを設定すれば、各システム等の従来のIPアドレスを変えなくても済み、スムーズに移行できると思っています。 なお、WindowsServerはintel Xeon Silver、NICは100Gbps(QSFP28)デュアルポートです。 WindowsServerのIPをA、従来NASに入っていたファイルの保存場所のIPをBとします。 上記の方法で統合すると、AとBの間の通信スピードは、WindowsServer(A内)で処理されたのと同じスピードを期待できるでしょうか? それとも、WindowsServerマシン(A)から出て、一度ハブ等に入り、再度WindowsServerマシン内のファイル(B)に入る程度のスピードしか期待できないでしょうか? それとも、勉強中であまり詳しくありませんが、WindowsServer(A内)でIP変換処理する、スピードが期待できる他の方法などありますでしょうか? 最悪、BはServer内で変換出来さえすれば、外部からの(元々NASに入っていた)フォルダやファイルする時のアクセスはAに変えても良いのですが、システムのコードに設定してある(元々NASに入っていた)ファイルにアクセスする時のIPはBのままで行きたいと思います。 教えていただけると嬉しいです。 よろしくお願いいたします。

専門家に質問してみよう