ソケットプログラミングのお勉強その1

TCP/IPプログラミングをポイント5まで。C言語のソースをC#に置き換えながら読んでいますが、やっぱC#(というか.NET)は楽チンです。

以下、単純なTCPサーバー。

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

class SocketServer {
  [STAThread]
  static void Main(string args) {
    Socket s = null;
    Socket s1 = null;

    try {
      int len;
      int port = 30000;
      byte recv = new byte [256];

      s = new Socket(AddressFamily.InterNetwork, 
        SocketType.Stream, ProtocolType.Tcp);
      s.Bind(new IPEndPoint(IPAddress.Any, port));
      s.Listen(5);
      s1 = s.Accept();
      len = s1.Receive(recv);
      Console.WriteLine("{0}", Encoding.ASCII.GetString(recv, 0, len));
      s1.Send(Encoding.ASCII.GetBytes("Hello"));
    }
    catch (SocketException e) {
      Console.WriteLine(e.Message);
    }
    finally {
      if (s != null) 
        s.Close();
      if (s1 != null)
        s1.Close();
    }
  }
}

例外によるエラー処理はどうも不慣れです。例えばソケットの受信で、Cの場合は戻り値でエラー処理しますが、C#では例外処理に任せてしまって良いのか、負はあり得ない*1と決め込んで良いのか。また、ソケットのクローズもtryの外側で参照持っておいて最後でfinallyするのがよいのか、都度try〜catchするのが良いのか、クローズはusingに任せてしまいfinallyでエラー処理するのが良いのか。この辺は自分のスタイルが確立出来てないなぁ・・・

*1:Monoのソース読んだ限りはなさそう