1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
| using System; using System.Net; using System.Net.Sockets; using System.Threading.Tasks; using System.IO; using System.Text; using System.Linq; using System.Collections.Concurrent; using System.Threading;
public partial class Server { public static void Main() { var serverTask = Task.Run(() => TCPServer()); // 指定したすべての Task オブジェクトの実行が完了するまで待機 Task.WaitAll(serverTask); }
public static async Task TCPServer() { byte[] token = Encoding.UTF8.GetBytes("1qaz2wsx"); byte[] SuccessToken = Encoding.UTF8.GetBytes("OK"); byte[] FailToken = Encoding.UTF8.GetBytes("NG"); var port = 8888;
// TCP接続を待機する var listener = new TcpListener(new IPEndPoint(IPAddress.Loopback, port)); listener.Start();
while(true) { // クライアントから接続があったら var client = await listener.AcceptTcpClientAsync().ConfigureAwait(false); using(var stream = client.GetStream()) { try { // クライアントからのデータを受信 var buf = await read(stream, token.Length); Func<byte[], string> EncString = b => Encoding.UTF8.GetString(b, 0, b.Length);
// クライアントへレスポンス if (EncString(token) == EncString(buf)) { Console.WriteLine("OK"); await stream.WriteAsync(SuccessToken, 0, SuccessToken.Length).ConfigureAwait(false); } else { Console.WriteLine("NG"); await stream.WriteAsync(FailToken, 0, FailToken.Length).ConfigureAwait(false); } } catch(Exception ex) { Console.WriteLine("Exception"); var exMessage = Encoding.UTF8.GetBytes(ex.Message); await stream.WriteAsync(exMessage, 0, exMessage.Length).ConfigureAwait(false);
var exStackTrace = Encoding.UTF8.GetBytes(ex.StackTrace); await stream.WriteAsync(exStackTrace, 0, exStackTrace.Length).ConfigureAwait(false); } } } }
static async Task<byte[]> read(NetworkStream stream, int rest) { var buf = new byte[rest]; var offset = 0; while (rest > 0) { var readed = await stream.ReadAsync(buf, offset, rest).ConfigureAwait(false); Console.WriteLine(readed); if (readed == 0 || !stream.DataAvailable) { Console.WriteLine("break"); break; } offset += readed; rest -= readed; } Console.WriteLine("read end"); return buf; } }
|