inf102
@inf102

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

TCP/IPサーバ側 ソケットのローカルIPアドレス指定方法

WPF .NETFRAME WORK C#です。

TCP/IPのサーバ側で、

Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

という感じでAddressFamily.InterNetwork を指定する方法と、

string IPV4="192.168.3.1";
System.Net.IPAddress ipAdd = System.Net.IPAddress.Parse(IPV4);
IPEndPoint EndPoint = new IPEndPoint(ipAdd, PORT);

Socket socket = new Socket(ipAdd.AddressFamily, SocketType.Stream, ProtocolType.Tcp);

の二通りありますがどちらが最善なんでしょうか。
一応、どちらでも使用可の様です。

0

5Answer

どちらが最善なんでしょうか。

前者です。

詳細なオプションなどを含めたいなら後者的な方法を採用しますが
Socket(AddressFamily, SocketType, ProtocolType) の場合、全てのパラメーターは列挙型でオプションを含めるって事はありません。

提示されてる後者のコードのipAddEndPoint変数をSocket以外で再使用しない(計画性が無い)のであれば「無駄な遠回りをしてる」です。

2Like

MSのサンプルではAddressFamily.InterNetworkのようです。
どちらでもいいというのは逆に困りますね。

1Like

Comments

  1. 警子ちゃんのrshのプロトコルをSystem.Net.Socketでプログラミングすると、どちらでもいいとはならないとおもいます。多分?tcpストリームの制御で2番目の方式を選ぶことになるかも?予感です。

いろいろありがどうございます。
それにしてもソケットは難しいけど面白い。非同期化も必要だし難易度的にはかなり高めですね。やりがいありますわ。
バークレー(BSD)ソケット(sock_addrin構造体とか使うアレ)比べると楽にはなりましたが。
MSもその辺のこと考えてなるべく簡単に使えるように設計してくれたんでしょうが。

1:n のチャット作って最近、FTP作りました。
今は1バイトづつ送ってるんで10MBytesだと1000万回送信掛けるんでPCからの悲鳴が聞こえてきそう。
それでもきちんと送れてるところがTCP/IPの凄み。

1Like

私はAddressFamily.InterNetworkの1行派です。

さて、ローカルポートに限定するなら、どちらでも良いと思います。

しかし、継承の仕方でtcpのオプションが全て、どちらも指定できるとはかぎりません。上位クラス連携ができたり、できなかったりするかもしれません。

ライブラリーが作成された経緯を読み取り、オプションパラメタの種類を確認し、用途を判断してください。

p.s. 警子ちゃんのローカルポートは1023/tcpで、それが利用できない時、1番デクリメントする仕様なのですが、メーカーのfwの解説には

1020/tcp~1023/tcp

4ポートのみになっていました。昔は確か、514番までデクリメントできたのですが。

0Like

Comments

  1. @inf102

    Questioner

    警子ちゃん? 全く知らないのですが随分低いポート番号使うんですね。予約されてるんじゃないかな。

そもそもSocketのコンストラクタでIPアドレスを設定することはできないです。
AddressFamilyは「アドレスの種類」(事実上IPv4かIPv6かの二択)を指定する列挙値でしかありません。
IPアドレス/ポートは[Connectメソッド](https://learn.microsoft.com/ja-jp/dotnet/api/system.net.sockets.socket.connect]などで指定するものです。

だからIPアドレスがIPv4のみしかありえないなら一つ目でいいし、今はそうでなくても将来的にIPv6も扱えるようにしておきたいなら二つ目ということになるでしょう。

0Like

Comments

  1. @inf102

    Questioner

    https://yuyu-code.com/programming-languages/c-sharp/socket-communications/
    ここのサンプルは後者使用です。

    192.168.3.2 <-> 192.168.3.5 間などでは前者、後者共に通信できましたが 前者の設定で192.168.3.2 <-> 10.12.1.5 等ドメインが違うと通信不可でした。後者にすると通信可。
    普通は前者でも通信可だが、ルータ、L3スイッチの設定如何で後者でないと通信できないのかも知れません。
    レアケースなのか仕様なのかよくわかりません。

    ちなみにリンク先のクライアント側で宛先IPは自身のローカルIPを指定している模様。
    サーバとクライアントが同じPCでの試験なら良いんですが..。

Your answer might help someone💌