C#でソケットを操作する方法

プロセス間通信は、接続された2つ以上のプロセス間でデータを交換する機能であり、ソケットを使用して実現できます。サーバーとクライアントの間の接続、つまりサーバープロセスとクライアントプロセスが確立された後、ソケットを使用してデータを交換する目的で通信できます。

ソケットは、ネットワーク上で実行されている2つのプロセス間の双方向通信のエンドポイントです。System.NetおよびSystem.Net.Sockets名前空間を利用して、C#のソケットを操作できます。前者はソケットを使用した高レベルの操作に使用されますが、後者はソケットを操作する際の低レベルの操作に使用されます。

ソケットを使用する場合は、TCP / IP(伝送制御プロトコル/インターネットプロトコル)またはUDP / IP(ユーザーデータグラムプロトコル/インターネットプロトコル)通信メカニズムのいずれかを使用できます。ネットワークを介して2つ以上のプロセス間でデータを交換するために、TCPおよびUDPトランスポートプロトコルを利用できます。TCP(Transmission Control Protocol)は安全で信頼性の高いコネクション型プロトコルですが、UDP(User Datagram Protocol)は比較的安全性や信頼性が低く、高速でコネクションレス型のプロトコルです。

次のコードリストは、System.Net.Dnsクラスを利用してシステムのIPアドレスを表示する方法を示しています。

public static void Main(string[] args)

        {

            string hostName = Dns.GetHostName();

            try

            {

                IPAddress[] ipAddress = Dns.Resolve(hostName).AddressList;

                foreach (IPAddress address in ipAddress)

                    Console.WriteLine("{0}/{1}", hostName, address);

            }

            catch (Exception ex)

            {

                Console.WriteLine("Error occurred: "+ex.Message);

            }

            Console.Read();

        }

上記のコードリストを参照してください。Dns.GetHostName()メソッドはシステムの名前を返しますが、Dns.Resolve()メソッドはIPHostEntryタイプの配列を取得するために使用されます。

ネットワーク情報の取得

System.Net.NetworkInformation名前空間を使用して、C#でネットワークメタデータ(つまり、ネットワークの変更、ネットワークイベント、プロパティなど)を取得できます。例として、ネットワーク接続が利用可能かどうかを確認したい場合は、以下に示すようにGetIsNetworkAvailable()メソッドを使用できます。

System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable();

コードでこのメソッドを呼び出す方法は次のとおりです。

Boolean networkAvailable = NetworkInterface.GetIsNetworkAvailable();

IPアドレスの変更を監視する場合は、NetworkChangeクラスの次のイベントを使用できます。

System.Net.NetworkInformation.NetworkChange.NetworkAvailabilityChanged

System.Net.NetworkInformation.NetworkChange.NetworkAddressChanged

ネットワークインターフェイスに関する情報を取得するには、NetworkInterfaceクラスのGetAllNetworkInterfaces()メソッドを使用できます。

NetworkInterface[] networkInterfaces = NetworkInterface.GetAllNetworkInterfaces();

すべてのネットワークインターフェイスのリストを取得したら、次のコードを使用して、コンソールに各ネットワークインターフェイスの情報を表示できます。

foreach (NetworkInterface networkInterface in networkInterfaces)

            {

                Console.WriteLine("Network ID :  " + networkInterface.Id);

                Console.WriteLine("Network Name :  " + networkInterface.Name);

                Console.WriteLine("Network Description\n:  " + networkInterface.Description);               

            }

参考までに、完全なコードリストを次に示します。

static void Main(string[] args)

        {

            NetworkInterface[] networkInterfaces = NetworkInterface.GetAllNetworkInterfaces();

            foreach (NetworkInterface networkInterface in networkInterfaces)

            {

                Console.WriteLine("Network ID  :  " + networkInterface.Id);

                Console.WriteLine("Network Name  :  " + networkInterface.Name);

                Console.WriteLine("Network Description  \n:  " + networkInterface.Description);               

            }

            Console.Read();

        }

クライアントサーバープログラミング

TCPを使用してネットワークプログラミングを行う場合、通常、特定のポートで開始するサーバープロセスと、任意のポートで開始してサーバーに接続要求を送信できるクライアントプロセスを作成する必要があります。サーバープロセスは、起動後、起動されたポートで着信接続要求をリッスンします。次のコードスニペットは、System.Net.Sockets.TcpListenerクラスを利用して、ソケットクラスと組み合わせて使用​​する方法を示しています。

TcpListener listener = new TcpListener(1234);

listener.Start();

Socket socket = listener.AcceptSocket();

Stream networkStream = new NetworkStream(socket);

次のコードスニペットは、ソケットクライアントがTCPプロトコルを使用してサーバーに接続する方法を示しています。

String ipAddress = "specify the ip address here";

System.Net.IPAddress ipAddress = System.Net.IPAddress.Parse(ipAddress);

System.Net.IPEndPoint remoteEndPoint = new IPEndPoint (ipAddress,9000);

socketClient.Connect (remoteEndPoint);

クライアントからサーバーにデータを送信するには、次のコードスニペットを使用できます。

try

{

  String text = "Hello World!";

  byte[] data = System.Text.Encoding.ASCII.GetBytes(text);

  socketClient.Send(data);

}

catch (SocketException se)

{

  //Write your exception handling code here

}

ソケットクラスのReceive()メソッドを使用してデータを受信できます。これを使用してソケットからデータを取得する方法は次のとおりです。SendメソッドとReceiveメソッドの両方がブロックしていることに注意してください。つまり、データが送信または受信されるまで、現在実行中のスレッドをブロックします。

byte[] data = new byte[1024];

int i = socketClient.Receive (data);

ソケットを操作するには、System.NetおよびSystem.Net.Sockets名前空間をプログラムに組み込む必要があることに注意してください。

using System.Net;

using System.Net.Sockets;