ソケットプログラミングのお勉強その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のソース読んだ限りはなさそう