123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166 |
- using ScreenExtender.Resources;
- using System.IO;
- using System.Net;
- using System.Net.Sockets;
- using System.Text;
- using System.Threading;
- using System.Threading.Tasks;
- namespace ScreenExtender
- {
- internal class ScreenExtenderServer
- {
- private readonly ScreenExtenderMainForm _mainForm;
- private Socket _server;
- private bool _isRunning;
- public ScreenExtenderServer(ScreenExtenderMainForm mainForm)
- {
- _mainForm = mainForm;
- }
- public void Start(IPAddress listen, int port)
- {
- _server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
- _server.Bind(new IPEndPoint(listen, port));
- _server.Listen(1);
- _isRunning = true;
- Task.Factory.StartNew(ServerProc);
- }
- public void Stop()
- {
- _isRunning = false;
- _server?.Close();
- _server?.Dispose();
- }
- private void ServerProc()
- {
- while (_isRunning)
- {
- var client = _server.Accept();
- Task.Factory.StartNew(() => RequestProc(client));
- }
- }
- private void RequestProc(Socket client)
- {
- string req = "";
- {
- var buf = new byte[4096];
- var len = client.Receive(buf, 0, buf.Length, SocketFlags.None);
-
- var text = Encoding.ASCII.GetString(buf, 0, len);
- var lines = text.Split('\r', '\n');
- if (lines.Length > 0 && lines[0].StartsWith("GET"))
- {
- var parts = lines[0].Split(new[] { ' ' }, 3);
- if (parts.Length > 1) req = parts[1];
- }
- }
- var stream = new NetworkStream(client, true);
- if (req == "")
- {
- var ns = new NetworkStream(client);
- var w = new BinaryWriter(ns);
- while (_isRunning)
- {
- Thread.Sleep(100);
- var rBuf = _mainForm.FrameBytes;
- if (rBuf == null) continue;
- try
- {
- w.Write(rBuf.Length);
- w.Write(rBuf);
- }
- catch (IOException)
- {
- break;
- }
- }
- client.Close();
- }
- var path = req.Split('?')[0];
- switch (path)
- {
- case "/":
- {
- var rBuf = ResourceFetcher.IndexPage;
- var writer = new BinaryWriter(stream);
- writer.Write(Encoding.ASCII.GetBytes("HTTP/1.1 200 OK\r\n"));
- writer.Write(Encoding.ASCII.GetBytes("Content-Type: text/html\r\n"));
- writer.Write(Encoding.ASCII.GetBytes("Content-Length: " + rBuf.Length + "\r\n"));
- writer.Write(Encoding.ASCII.GetBytes("\r\n"));
- writer.Write(rBuf);
- writer.Close();
- client.Close();
- }
- break;
- case "/mjpeg":
- {
- var writer = new BinaryWriter(stream);
- writer.Write(Encoding.ASCII.GetBytes("HTTP/1.1 200 OK\r\n"));
- writer.Write(Encoding.ASCII.GetBytes("Content-Type: multipart/x-mixed-replace; boundary=frame\r\n"));
- while (_isRunning)
- {
- var rBuf = _mainForm.FrameBytes;
- if (rBuf == null)
- {
- Thread.Sleep(100);
- continue;
- }
- writer.Write(Encoding.ASCII.GetBytes("\r\n"));
- writer.Write(Encoding.ASCII.GetBytes("--frame\r\n"));
- writer.Write(Encoding.ASCII.GetBytes("Content-Type: image/png\r\n"));
- writer.Write(Encoding.ASCII.GetBytes("Content-Length: " + rBuf.Length + "\r\n"));
- writer.Write(Encoding.ASCII.GetBytes("\r\n"));
- writer.Write(rBuf);
- }
- client.Shutdown(SocketShutdown.Both);
- client.Close();
- client.Dispose();
- }
- break;
- case "/frame":
- {
- byte[] rBuf;
- do
- {
- rBuf = _mainForm.FrameBytes;
- if (rBuf != null) break;
- Thread.Sleep(100);
- } while (true);
- var writer = new BinaryWriter(stream);
- writer.Write(Encoding.ASCII.GetBytes("HTTP/1.1 200 OK\r\n"));
- writer.Write(Encoding.ASCII.GetBytes("Content-Type: image/png\r\n"));
- writer.Write(Encoding.ASCII.GetBytes("Content-Length: " + rBuf.Length + "\r\n"));
- writer.Write(Encoding.ASCII.GetBytes("\r\n"));
- writer.Write(rBuf);
- writer.Close();
- client.Close();
- }
- break;
- default:
- client.Close();
- break;
- }
- }
- }
- }
|