Автор Тема: Простейший C-sharp socket policy server  (Прочитано 1441 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Ноябрь 02, 2013, 15:30:38 pm
Прочитано 1441 раз

Mimi Neko

  • Администратор
  • Старожил форума

  • Оффлайн
  • *****

  • 2454
  • Репутация:
    153
    • Просмотр профиля
Простой C-sharp socket policy server, который слушает 843 порт и отдает crossdomain.xml (по примеру такого же Java-сервера)
Разрешенные хосты можно отредактировать в коде.

crossdomain.xml:
<?xml version="1.0" ?>
<cross-domain-policy>
<allow-access-from domain="*" to-ports="80"/>
</cross-domain-policy>

Если запускать на линуксе, то запуск такой:
exec mono "./PolicyServer.exe" "$@"

Program.cs
namespace PolicyServer
{
    class Program
    {
        static void Main(string[] args)
        {
            Server.Run();
        }
    }
}

Server.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
 
namespace PolicyServer
{
    public sealed class Server
    {
        const int Port = 12345;
        private static string _policy = "";
        private static TcpListener _socketServer;
        private static Thread _listenerThread;
        private static bool _listen = true;
 
        public static void Run()
        {
            _policy = BuildPolicy("*");
            _listenerThread = new Thread(Listen) { Priority = ThreadPriority.Lowest };
            _listenerThread.Start();
 
        }
 
        public static void Stop()
        {
            _listen = false;
        }
 
        private static void Listen()
        {
            _socketServer = new TcpListener(IPAddress.Any, 843);
            try
            {
                _socketServer.Start();
            }
            catch (Exception e)
            {
                _listen = false;
                Console.WriteLine(e.Message);
                Console.ReadLine();
            }
            Console.WriteLine("Start Policy server.");
            while (_listen)
            {
                var socket = _socketServer.AcceptSocket();
                if (socket.Connected)
                {
                    var clientThread = new Thread(Recive);
                    clientThread.Start(socket);
                }
            }
        }
 
        private static void Recive(object client)
        {
            var socket = (Socket) client;
            try
            {
                Console.WriteLine("Send crossdomain.xml to " + socket.RemoteEndPoint);
                var bytes = Encoding.UTF8.GetBytes(_policy);
                socket.Send(bytes);
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }
             
        }
 
        private static string BuildPolicy(string allowedHost)
        {
            return "<?xml version=\"1.0\"?><cross-domain-policy><allow-access-from domain=\"" + allowedHost +
                   "\" to-ports=\"" + Port +
                   "\" /></cross-domain-policy>";
        }
 
    }
}


Подключение к серверу из Unity3d:

using UnityEngine;
using System;
using System.Net.Sockets;
using System.Collections;
 
public class SocketClient:MonoBehaviour
{
    static TcpClient socketClient;
 
    void Start()
    {
        try
        {
            socketClient= new TcpClient("myhost.com", 843);
        } catch
        {
            Debug.LogError("Failed to connect to server");
            return;
        }
    }
}
« Последнее редактирование: Ноябрь 02, 2013, 15:49:28 pm от Mimi Neko »